在不打开浏览器的情况下,是否可以通过命令行在GitHub上创建远程存储库?

397

我创建了一个新的本地 Git 仓库:

~$ mkdir projectname
~$ cd projectname
~$ git init
~$ touch file1
~$ git add file1
~$ git commit -m 'first commit'
有没有任何git命令可以创建一个新的远程仓库,并且从这里将我的提交推送到GitHub?我知道只需打开浏览器并转到创建新存储库,但如果有一种从CLI实现此操作的方法,我会很高兴。

我读了大量文章,但我发现没有一个提到如何使用git命令从CLI创建远程存储库。 Tim Lucas的不错的文章设置新的远程Git存储库是我找到的最接近的方法,但是GitHub不提供Shell访问。

25个回答

349

Github API v3 的 CLI 命令(将所有大写关键字替换):

curl -u 'USER' https://api.github.com/user/repos -d '{"name":"REPO"}'
# Remember replace USER with your username and REPO with your repository/application name!
git remote add origin git@github.com:USER/REPO.git
git push origin master

50
第一条命令的问题在于,你会将 GitHub 密码留在 ~/.bash_history 中。我建议用 -u 'USER' 替换 -u 'USER:PASS',这样 curl 就会交互地要求你输入密码。 - ivanzoid
27
若希望从一开始就将代码仓库设为私有,请使用以下命令:curl -u 'USER' https://api.github.com/user/repos -d '{"name":"REPO", "private":"true"}' - Joe Fletcher
3
我写了一个 Bash 脚本,以节省我们所有人一些打字时间。接受用户输入并具有合理的默认值:https://gist.github.com/robwierzbowski/5430952 - RobW
3
以下是如何将其添加为git别名的方法:git config --global alias.gh-create '!sh -c "curl -u \"USERNAME\" https://api.github.com/user/repos -d \"{\\\"name\\\":\\\"$1\\\"}\"" -' - Robin Winslow
16
不要忘记你可以生成访问令牌,并使用以下方式:curl https://api.github.com/user/repos?access_token=myAccessToken -d '{"name":"REPO"}'。:-) - Ionică Bizău
显示剩余9条评论

226
您可以使用GitHub API通过命令行创建GitHub存储库。请查看存储库API。如果您向下滚动大约三分之一,您会看到一个名为"创建"的部分,其中说明如何通过API创建存储库(在此之前有一个部分也解释了如何使用API派生存储库)。显然,您不能使用git来完成此操作,但是您可以通过像curl这样的工具在命令行上执行此操作。

除API外,没有其他方式可以通过命令行在GitHub上创建存储库。正如您所指出的那样,除了GitHub API之外,GitHub不允许使用shell访问等,因此除了通过GitHub的Web界面之外,创建存储库的唯一方法就是使用GitHub的Web界面。


75
非常感谢 mipadi!我之前不知道 GitHub API。对于所有遇到同样问题的人,这是我基本上所做的:使用 curl -F 'login=username' -F 'token=API Token' https://github.com/api/v2/yaml/repos/create -F name=reponame 命令创建存储库。你可以在 GitHub 网站中找到 API Token,在 Account Settings 中查看 Administrative InformationAPI Token(32个字符的字符串)。 - anddoutoi
1
看起来这已经过时了,至少我在那里找不到API令牌。 - Joachim Breitner
12
以下是API版本3的语法,由@bennedich提供。https://dev59.com/k3E95IYBdhLWcg3wKq2q#10325316 - JiminyCricket
2
@cseder:Git 不需要这样创建一个仓库,但在 GitHub 上设置一个仓库是需要的。我认为 Mercurial 也不允许你通过将代码推送到不存在的仓库来在远程服务器上创建仓库。 - mipadi
5
这个问题询问是否可以通过GitHub API在GitHub上创建远程存储库,而不是如何在GitHub上创建新存储库并推送到现有存储库。 - mipadi
显示剩余6条评论

78

这可以通过三个命令来完成:

curl -u 'nyeates' https://api.github.com/user/repos -d '{"name":"projectname","description":"This project is a test"}'
git remote add origin git@github.com:nyeates/projectname.git
git push origin master

(更新至v3 Github API)


这些命令的解释...

创建Github仓库

    curl -u 'nyeates' https://api.github.com/user/repos -d '{"name":"projectname","description":"This project is a test"}'
  • curl是一个Unix命令(Mac上也适用),可检索和与URL交互。通常已经安装。
  • "-u"是一个curl参数,用于指定用户名称和密码以用于服务器身份验证。
    • 如果只给出用户名(如上例所示),curl将提示输入密码。
    • 如果不想输入密码,请参阅github的API文档中的Authentication
  • "-d"是一个curl参数,允许您发送POST数据与请求一起发送
  • "name"是唯一要求的POST数据;我喜欢同时包括"description"
  • 我发现最好用单引号 ' ' 引用所有POST数据

定义推送到哪里

git remote add origin git@github.com:nyeates/projectname.git
  • 添加关于github上连接的(远程)仓库位置和存在性的定义
  • "origin"是git用来表示代码来源的默认名称。
    • 技术上并不是来自github,但现在github仓库将成为记录的源。
  • "git@github.com:nyeates"是一种ssh连接方式,它假设您已经使用github设置了可信的ssh密钥对。

将本地仓库推送到github

git push origin master
  • 将本地的master分支推送到远程(origin)仓库(github)

54
如果您安装了 Defunkt 出色的 Hub 工具,那么这将变得非常容易

hub create

用作者的话说,"hub 是一个命令行包装器,使您在 GitHub 上更加优秀。"

3
我喜欢 hub!另外很有用的是 hub - 或者通常被别名为 github... git fork 会为你所克隆的仓库的当前工作目录创建一个分支副本... 好耶。 - Alex Gray
2
这个工具太棒了!它可以帮你存储认证令牌,这样你就不必一遍又一遍地输入密码了。还可以看看 GitHub 的 ZSH 插件。 - Dorian

30

使用Github官方新的命令行界面

gh repo create

查看附加详细信息和选项以及安装说明


例如,为了完成您的Git工作流程:

mkdir project
cd project
git init
touch file
git add file
git commit -m 'Initial commit'
gh repo create
git push -u origin master

21

简单步骤(使用git + hub => GitHub):

  1. 安装HubGitHub)。

    • OS X:brew install hub
    • 已安装Gogo get github.com/github/hub
    • 否则(也需要安装Go):

      git clone https://github.com/github/hub.git && cd hub && ./script/build
      
  2. 前往您的存储库或创建一个空存储库:mkdir foo && cd foo && git init

  3. 运行:hub create,第一次会要求输入GitHub凭据。

    用法:hub create [-p] [-d DESCRIPTION] [-h HOMEPAGE] [NAME]

    示例:hub create -d Description -h example.com org_name/foo_repo

    Hub将在需要访问API并交换OAuth令牌时首次提示输入GitHub用户名和密码,并将其保存在~/.config/hub中。

    要明确命名新存储库,请传入NAME,可选择以ORGANIZATION/NAME形式创建属于您所属组织的存储库。

    使用-p创建私有存储库,使用-d-h分别设置存储库的描述和主页URL。

    要避免提示,请使用GITHUB_USERGITHUB_PASSWORD环境变量。

  4. 然后像往常一样提交和推送或检查hub commit/hub push

要获取更多帮助,请运行:hub help

另请参阅GitHub上的使用命令行导入Git存储库


我该如何设置GITHUB_USER和GITHUB_PASSWORD环境变量? - Kasper
1
你可以尝试导出它们,参见: GH #245 - kenorb
1
对我来说非常好用,注意“hub”也可以在MacPorts上获得。 - tiktak

11

有一个官方的Github宝石,我认为可以做到这一点。随着我的学习,我会尽量添加更多信息,但是我现在才刚刚发现这个宝石,所以还不太了解。

更新:在设置了我的API密钥之后,我能够通过create命令在github上创建一个新的存储库,但是我无法使用create-from-local命令,该命令应该将当前本地存储库制作成相应的远程存储库。

$ gh create-from-local
=> error creating repository

如果有人对此有任何见解,我很想知道我做错了什么。已经有一个问题已提交
更新:最终我确实让它工作了。我不太确定如何重新制作这个问题,但我从头开始(删除了.git文件夹)。
git init
git add .emacs
git commit -a -m "adding emacs"

现在这行代码将创建远程仓库并将其推送,但不幸的是我认为无法指定我想要的仓库名称。我希望它在github上被称为“dotfiles”,但gh gem只使用了当前文件夹的名称,因为我在我的主文件夹中。 (我添加了一个请求以获得所需的行为)
gh create-from-local

这个命令接受一个参数来指定远程仓库的名称,但它是用于从头开始启动新项目的,也就是说,在调用此命令后,您将得到一个新的远程仓库,该仓库跟踪相对于当前位置新创建的子文件夹中的本地仓库,并且两者的名称均为指定的参数。
gh create dotfiles

3
这个项目已经有几年没有进行过任何工作,对我来说也没用,正如在这里所暗示的一样,它已经死了。据推测,已被 hub 工具所取代,如此答案中所建议的那样。 - jameshfisher

10

如何使用 Bash Shell 快速创建远程仓库

每次创建仓库时都要输入完整的代码很麻烦。

curl -u 'USER' https://api.github.com/user/repos -d '{"name":"REPO"}' git remote add origin git@github.com:USER/REPO.git git push origin master

更简单的方法是:

  1. 在目录 /home/USER_NAME/Desktop/my_scripts 中创建一个名为 githubscript.sh 的 shell 脚本文件。
  2. 修改并保存以下代码到 githubscript.sh 文件中。
#!bin/bash
curl -u 'YOUR_GITHUB_USER_NAME' https://api.github.com/user/repos -d "{\"name\":\"$1\"}";
git init;
git remote add origin git@github.com:YOUR_GITHUB_USER_NAME/$1.git;

N.B. 这里的$1是当调用script时传递的repository name参数。在保存脚本之前,请更改YOUR_GITHUB_USER_NAME

  1. 设置script文件所需的权限 chmod 755 githubscript.sh

  2. 在环境配置文件中包含scripts目录。 nano ~/.profile; export PATH="$PATH:$HOME/Desktop/my_scripts"

  3. 还要设置一个别名来运行githubscript.sh文件。 nano ~/.bashrc; alias githubrepo="bash githubscript.sh"

  4. 现在在终端中重新加载.bashrc.profile文件。 source ~/.bashrc ~/.profile;

  5. 现在创建一个新的存储库,即demo githubrepo demo;


1
在你的代码中,我把这一部分从:git remote add origin git@github.com:YOUR_GITHUB_USER_NAME/$1.git;改为git remote add origin https://github.com/YOUR_GITHUB_USER_NAME/$1.git;供那些不使用SSH密钥的用户使用。 - Damiii

7

目前,无论是被接受的答案还是目前得到最多票数的答案都已过时。密码身份验证已经不再建议使用,并将于2020年11月13日16:00 UTC之后被删除。

现在使用GitHub API的方式是通过个人访问令牌。

您需要(替换所有大写关键词):

  1. 通过网站创建个人访问令牌。是的,您必须使用浏览器,但这只需一次即可用于未来的所有访问。请安全地存储该令牌。
  2. 通过
curl -H 'Authorization: token MY_ACCESS_TOKEN' https://api.github.com/user/repos  -d '{"name":"REPO"}'

或者,从一开始就使其变为私有:
curl -H 'Authorization: token MY_ACCESS_TOKEN' https://api.github.com/user/repos -d '{"name":"REPO", "private":"true"}'
  1. 添加新的来源并将其推送:
git remote add origin git@github.com:USER/REPO.git
git push origin master

这种方法的缺点是每次都需要输入令牌,并且它会出现在您的bash历史记录中。

为了避免这个问题,您可以:

  1. 将头信息存储在一个文件中(我们称之为 HEADER_FILE
Authorization: token MY_ACCESS_TOKEN
  1. 让curl从文件中读取内容
curl -H @HEADER_FILE https://api.github.com/user/repos -d '{"name":"REPO"}' # public repo
curl -H @HEADER_FILE https://api.github.com/user/repos -d '{"name":"REPO", "private":"true"}' # private repo

为了增强安全性,您可以将访问权限设置为400,并将用户设置为root。
chmod 400 HEADER_FILE
sudo chown root:root HEADER_FILE
  1. 现在需要使用sudo来访问头文件
sudo curl -H @HEADER_FILE https://api.github.com/user/repos -d '{"name":"REPO"}' # public repo
sudo curl -H @HEADER_FILE https://api.github.com/user/repos -d '{"name":"REPO", "private":"true"}' # private repo

6
根据@Mechanical Snail的另一个答案,但不需要使用Python,我发现这太过于复杂了。请将以下内容添加到您的~/.gitconfig文件中:
[github]
    user = "your-name-here"
[alias]
    hub-new-repo = "!REPO=$(basename $PWD) GHUSER=$(git config --get github.user); curl -u $GHUSER https://api.github.com/user/repos -d {\\\"name\\\":\\\"$REPO\\\"} --fail; git remote add origin git@github.com:$GHUSER/$REPO.git; git push origin master"

我喜欢这个别名。再次感谢@Robru。附言:如果这不起作用,或在重新安装操作系统后停止工作,请确保您已安装curl! - daveloyall

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接