是否可以在不打开浏览器的情况下从 CLI 在 GitHub 上创建远程存储库?
Posted
技术标签:
【中文标题】是否可以在不打开浏览器的情况下从 CLI 在 GitHub 上创建远程存储库?【英文标题】:Is it possible to create a remote repo on GitHub from the CLI without opening browser? 【发布时间】:2011-01-26 07:07:51 【问题描述】:我创建了一个新的本地 Git 存储库:
~$ mkdir projectname
~$ cd projectname
~$ git init
~$ touch file1
~$ git add file1
~$ git commit -m 'first commit'
是否有任何 git 命令来创建一个新的 remote 存储库并将我的提交从这里推送到 GitHub? 我知道启动浏览器并没有什么大不了的前往Create a New Repository,但如果有办法通过 CLI 实现这一点,我会很高兴。
我阅读了大量文章,但没有一篇文章提到如何使用 git 命令从 CLI 创建远程仓库。 Tim Lucas 的好文章 Setting up a new remote git repository 是我找到的最接近的,但 GitHub 不提供 shell 访问权限。
【问题讨论】:
【参考方案1】:如果你安装了defunkt's优秀的Hub工具,那么这将变得如此简单
hub create
用作者的话来说,“hub 是 git 的命令行包装器,可以让你在 GitHub 上做得更好。”
【讨论】:
我爱hub
!同样有用的是hub
- 或者hub
通常是git
的别名...git fork
,它为您所在的克隆回购的pwd
创建回购的一个分支。 . 是的。
这个工具太棒了!它负责为您存储身份验证令牌,因此您不必一遍又一遍地输入密码。还可以查看 github 的 ZSH 插件。【参考方案2】:
到目前为止,the accepted answer 和 the most-voted answer 都已过时。密码认证为deprecated,将于2020年11月13日16:00 UTC解除。
现在使用 GitHub API 的方式是通过个人访问令牌。
您需要(替换全部大写的关键字):
-
Create a personal access token 通过网站。是的,您必须使用浏览器,但对于以后的所有访问,它只有一次。安全地存储令牌。
通过以下方式创建存储库
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"'
-
添加新的原点并推送到它:
git remote add origin git@github.com:USER/REPO.git
git push origin master
这样做的缺点是您每次都必须输入令牌,并且它会出现在您的 bash 历史记录中。
为避免这种情况,您可以
-
将标头存储在文件中(我们称之为
HEADER_FILE
)
Authorization: token MY_ACCESS_TOKEN
-
从文件中读取 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
-
现在需要 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
【讨论】:
【参考方案3】:最后,GitHub 正式宣布了所有核心功能的新 CLI。
在这里查看:https://cli.github.com/
通过 HomeBrew 安装:brew install gh
其他方式:https://github.com/cli/cli#installation
然后
gh repo create
其他可用功能。
$ gh --help
Work seamlessly with GitHub from the command line.
USAGE
gh <command> <subcommand> [flags]
CORE COMMANDS
gist: Create gists
issue: Manage issues
pr: Manage pull requests
release: Manage GitHub releases
repo: Create, clone, fork, and view repositories
ADDITIONAL COMMANDS
alias: Create command shortcuts
api: Make an authenticated GitHub API request
auth: Login, logout, and refresh your authentication
completion: Generate shell completion scripts
config: Manage configuration for gh
help: Help about any command
FLAGS
--help Show help for command
--version Show gh version
EXAMPLES
$ gh issue create
$ gh repo clone cli/cli
$ gh pr checkout 321
ENVIRONMENT VARIABLES
See 'gh help environment' for the list of supported environment variables.
LEARN MORE
Use 'gh <command> <subcommand> --help' for more information about a command.
Read the manual at https://cli.github.com/manual
FEEDBACK
Open an issue using 'gh issue create -R cli/cli'
所以现在您可以从终端创建 repo。
【讨论】:
【参考方案4】:更新 20200714
Github 有了新的官方CLI。
...gh 是一个新项目,可帮助我们探索具有根本不同设计的官方 GitHub CLI 工具的外观。虽然这两个工具都将 GitHub 带到了终端,但 hub 充当 git 的代理,而 gh 是一个独立的工具。
与 hub 的核心区别在于它不会覆盖现有的 git 命令。因此,您不能像使用 hub 那样将 git 别名为 gh。
我们没有将它添加到集线器,因为我们决定将 GitHub CLI 设计为不同于 git 包装器,即作为它自己的命令。事实证明,维护一个作为 git 代理的可执行文件是很难维护的,而且我们不想因为必须始终保持 git 兼容性而受到限制。我们不想在从一开始就很脆弱的范式上构建 GitHub CLI。
-- mislav (hub的维护者)
原答案
您需要的是hub。 Hub 是 git 的命令行包装器。它已使用别名与本机 git 集成。它尝试向 git 提供 github 操作,包括创建新存储库。
→ create a repo for a new project
$ git init
$ git add . && git commit -m "It begins."
$ git create -d "My new thing"
→ (creates a new project on GitHub with the name of current directory)
$ git push origin master
【讨论】:
【参考方案5】:与 Github 官方新 command line interface:
gh repo create
查看更多 details and options 和 installation instructions。
例如,完成你的 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
【讨论】:
【参考方案6】:免责声明:我是开源项目的作者
此功能支持:https://github.com/chrissound/Human-Friendly-Commands 本质上就是这个脚本:
#!/usr/bin/env bash
# Create a repo named by the current directory
# Accepts 1 STRING parameter for the repo description
# Depends on bin: jq
# Depends on env: GITHUB_USER, GITHUB_API_TOKEN
github_createRepo()
projName="$(basename "$PWD")"
json=$(jq -n \
--arg name "$projName" \
--arg description "$1" \
'"name":$name, "description":$description')
curl -u "$GITHUB_USER":"$GITHUB_API_TOKEN" https://api.github.com/user/repos -d "$json"
git init
git remote add origin git@github.com:"$GITHUB_USER"/"$projName".git
git push origin master
;
【讨论】:
这确实是使用 GitHubPersonal Access Token
的新方式。 (通过?access_token=$ACCESSTOKEN
添加它的旧方法不再有效。【参考方案7】:
找到了我喜欢的这个解决方案:https://medium.com/@jakehasler/how-to-create-a-remote-git-repo-from-the-command-line-2d6857f49564
您首先需要创建一个Github Personal Access Token
在您喜欢的文本编辑器中打开您的 ~/.bash_profile 或 ~/.bashrc。在文件顶部附近添加以下行,其余的 export 'ed 变量是:
export GITHUB_API_TOKEN=<your-token-here>
在下面的某个地方,通过您的其他 bash 函数,您可以粘贴类似于以下内容的内容:
function new-git()
curl -X POST https://api.github.com/user/repos -u <your-username>:$GITHUB_API_TOKEN -d '"name":"'$1'"'
现在,无论何时创建新项目,您都可以运行命令 $ new-git awesome-repo
在您的 Github 用户帐户上创建一个新的公共远程存储库。
【讨论】:
【参考方案8】:不,您必须至少打开一次浏览器才能在 GitHub 上创建 username
,创建后,您可以利用 GitHub API 从命令行创建存储库,执行以下命令:
curl -u 'github-username' https://api.github.com/user/repos -d '"name":"repo-name"'
例如:
curl -u 'arpitaggarwal' https://api.github.com/user/repos -d '"name":"command-line-repo"'
【讨论】:
然后git remote add origin https://github.com/github-username/repo-name.git
将您的本地项目链接到github。例如,命令如下所示:git remote add origin https://github.com/arpitaggarwal/command-line-repo.git
【参考方案9】:
适用于所有 Python 2.7.* 用户。 Github API 周围有一个 Python 包装器,目前在版本 3 上,称为 GitPython。只需使用easy_install PyGithub
或pip install PyGithub
安装即可。
from github import Github
g = Github(your-email-addr, your-passwd)
repo = g.get_user().user.create_repo("your-new-repos-name")
# Make use of Repository object (repo)
Repository
对象文档是 here。
【讨论】:
【参考方案10】:在命令行创建一个新的仓库
echo "# <RepositoryName>" >> README.md
git init
git add README.md
git commit -m "first commit"
git remote add origin https://github.com/**<gituserID>/<RepositoryName>**.git
git push -u origin master
从命令行推送现有存储库
git remote add origin https://github.com/**<gituserID>/<RepositoryName>**.git
git push -u origin master
【讨论】:
这不起作用;它不会创建 remote 存储库。【参考方案11】:您可以使用 GitHub API 通过命令行创建 GitHub 存储库。查看repository API。如果你向下滚动大约三分之一,你会看到一个标题为"Create" 的部分,它解释了如何通过 API 创建一个 repo(上面也是一个解释如何使用 API 分叉 repo 的部分) )。显然您不能使用git
来执行此操作,但您可以通过命令行使用curl
之类的工具来执行此操作。
在 API 之外,无法通过命令行在 GitHub 上创建存储库。正如您所提到的,GitHub 不允许 shell 访问等,因此除了 GitHub API 之外,创建 repo 的唯一方法是通过 GitHub 的 Web 界面。
【讨论】:
非常感谢 mipadi!不知道 GitHub API。对于其他有同样问题的人,我基本上就是这样做的:curl -F 'login=username' -F 'token=API Token' https://github.com/api/v2/yaml/repos/create -F name=reponame
。您的 API Token 可以在 GitHub 站点上找到,单击 Account Settings,查找 Administrative Information 和 API Token(32 个字符长的字符串)。
看来这个已经过时了,至少我没有找到API Token那里。
API 版本 3 语法在下面通过@bennedich ***.com/a/10325316/305633 给出
@cseder:Git 不需要这个来创建一个 repo,但是在 GitHub 上设置一个 就可以了。我不认为 Mercurial 也不允许您通过推送到不存在的存储库来在远程服务器上创建存储库。
@cseder:问题在于是否可以通过 GitHub API 在 GitHub 上创建远程仓库,而不是如何创建新仓库并推送到 GitHub 上的现有仓库。【参考方案12】:
简单步骤(使用git
+ hub
=> GitHub):
安装Hub (GitHub)。
OS X:brew install hub
有Go:go get github.com/github/hub
否则(也有Go):
git clone https://github.com/github/hub.git && cd hub && ./script/build
转到您的存储库或创建一个空的存储库:mkdir foo && cd foo && git init
。
运行:hub create
,它会第一次询问你关于 GitHub 的凭据。
用法:hub create [-p] [-d DESCRIPTION] [-h HOMEPAGE] [NAME]
示例:hub create -d Description -h example.com org_name/foo_repo
Hub 将在第一次需要访问 API 时提示输入 GitHub 用户名和密码,并将其交换为
OAuth
令牌,该令牌保存在~/.config/hub
中。要显式命名新存储库,请传入
NAME
, 可选择以ORGANIZATION/NAME
形式在组织下创建 你是其中的一员。使用
-p
,创建一个私有存储库,并使用-d
和-h
分别设置仓库的描述和主页URL
。为避免被提示,请使用
GITHUB_USER
和GITHUB_PASSWORD
环境变量。
然后像往常一样提交和推送或检查hub commit
/hub push
。
如需更多帮助,请运行:hub help
。
另请参阅:Importing a Git repository using the command line 在 GitHub。
【讨论】:
如何设置 GITHUB_USER 和 GITHUB_PASSWORD 环境变量? 或许你可以导出它们,见:GH #245。 对我来说效果很好,注意“集线器”也可以在 MacPorts 上使用。 我想这就是我要找的东西! :)【参考方案13】:基于@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!【参考方案14】:使用 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
更简单的方法是:
-
在名为
githubscript.sh
的目录即 /home/USER_NAME/Desktop/my_scripts 中创建一个 shell 脚本
修改以下代码并保存到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;
注意 这里的$1
是repository name
,在调用script
时作为argument
传递
在保存脚本之前更改YOUR_GITHUB_USER_NAME
。
设置script
文件所需的权限
chmod 755 githubscript.sh
在环境配置文件中包含脚本目录。
nano ~/.profile;
export PATH="$PATH:$HOME/Desktop/my_scripts"
还要设置一个别名来运行 githubscript.sh 文件。
nano ~/.bashrc;
alias githubrepo="bash githubscript.sh"
现在在终端中重新加载.bashrc
和.profile
文件。
source ~/.bashrc ~/.profile;
现在创建一个新的存储库,即demo
:
githubrepo demo;
【讨论】:
在您的代码中,我将这部分: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 密钥的用户。【参考方案15】:
出于代表原因,我不能将其添加为注释(最好使用 bennedich's answer),但对于 Windows 命令行,以下是正确的语法:
curl -u YOUR_USERNAME https://api.github.com/user/repos -d "\"name\":\"YOUR_REPO_NAME\""
这是相同的基本形式,但你必须使用双引号 (") 而不是单引号,并用反斜杠转义在 POST 参数中发送的双引号(在 -d 标志之后)。我还删除了周围的单引号我的用户名,但如果你的用户名有空格(可能吗?)它可能需要双引号。
【讨论】:
适用于 Windows 用户的好消息。不,用户名不能包含空格(github.com 的注册表单指出:“用户名只能包含字母数字字符或单个连字符,并且不能以连字符开头或结尾”)。因此,不需要对用户名进行双引号。 Github power shell 不接受带有 curl 的 -u,在 Windows 上 :(【参考方案16】:这是我最初的 git 命令(可能这个动作发生在C:/Documents and Settings/your_username/
):
mkdir ~/Hello-World
# Creates a directory for your project called "Hello-World" in your user directory
cd ~/Hello-World
# Changes the current working directory to your newly created directory
touch blabla.html
# create a file, named blabla.html
git init
# Sets up the necessary Git files
git add blabla.html
# Stages your blabla.html file, adding it to the list of files to be committed
git commit -m 'first committttt'
# Commits your files, adding the message
git remote add origin https://github.com/username/Hello-World.git
# Creates a remote named "origin" pointing at your GitHub repository
git push -u origin master
# Sends your commits in the "master" branch to GitHub
【讨论】:
Hello-World repo 在这种情况下应该在 GitHub 上可用,但不能解决问题中的问题。【参考方案17】:对于 Ruby 爱好者:
gem install githubrepo
githubrepo create *reponame*
根据提示输入用户名和密码
git remote add origin *ctrl v*
git push origin master
来源:Elikem Adadevoh
【讨论】:
【参考方案18】:这可以通过三个命令来完成:
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 并与 URL 交互。它通常已经安装。
“-u”是一个 curl 参数,用于指定用于服务器身份验证的用户名和密码。
如果您只提供用户名(如上例所示),curl 将提示输入密码。
如果您不想输入密码,请参阅Authentication 上的 githubs api 文档
“-d”是一个 curl 参数,允许您随请求发送 POST 数据
你在githubdefined API format发送POST数据
“名称”是唯一需要的 POST 数据;我还想加入“描述”
我发现用单引号 ' ' 引用所有 POST 数据是很好的
定义推送到哪里
git remote add origin git@github.com:nyeates/projectname.git
在 github 上添加已连接(远程)repo 的位置和存在性定义
"origin" 是 git 使用的默认名称,用于表示源的来源
技术上不是来自 github,但现在 github repo 将成为记录的来源
“git@github.com:nyeates”是一个 ssh 连接,假设您已经使用 github 设置了一个受信任的 ssh 密钥对。
将本地 repo 推送到 github
git push origin master
从本地主分支推送到源远程 (github)
【讨论】:
【参考方案19】:对于双因素认证的用户,可以使用bennedich的解决方案,但只需要在第一个命令中添加X-Github-OTP标头即可。将 CODE 替换为您从双因素身份验证提供程序获得的代码。将 USER 和 REPO 替换为存储库的用户名和名称,就像在他的解决方案中一样。
curl -u 'USER' -H "X-GitHub-OTP: CODE" -d '"name":"REPO"' https://api.github.com/user/repos
git remote add origin git@github.com:USER/REPO.git
git push origin master
【讨论】:
【参考方案20】:github API v3 的 CLI 命令(替换所有 CAPS 关键字):
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
【讨论】:
第一个命令的小问题是您将 GitHub 密码留在了~/.bash_history
中。我建议将-u 'USER:PASS'
替换为-u 'USER'
,然后curl 会以交互方式询问您的密码。
要从一开始就将 repo 设为私有,请使用:curl -u 'USER' https://api.github.com/user/repos -d '"name":"REPO", "private":"true"'
我写了一个 bash 脚本来节省我们所有的打字时间。接受用户输入并具有合理的默认值:gist.github.com/robwierzbowski/5430952
以下是如何将其添加为 git 别名:git config --global alias.gh-create '!sh -c "curl -u \"USERNAME\" https://api.github.com/user/repos -d \"\\\"name\\\":\\\"$1\\\"\"" -'
不要忘记您可以generate an access token 并以这种方式使用它:curl https://api.github.com/user/repos?access_token=myAccessToken -d '"name":"REPO"'
。 :-)【参考方案21】:
我创建了一个 Git 别名来执行此操作,基于 Bennedich's answer。将以下内容添加到您的~/.gitconfig
:
[github]
user = "your_github_username"
[alias]
; Creates a new Github repo under the account specified by github.user.
; The remote repo name is taken from the local repo's directory name.
; Note: Referring to the current directory works because Git executes "!" shell commands in the repo root directory.
hub-new-repo = "!python3 -c 'from subprocess import *; import os; from os.path import *; user = check_output([\"git\", \"config\", \"--get\", \"github.user\"]).decode(\"utf8\").strip(); repo = splitext(basename(os.getcwd()))[0]; check_call([\"curl\", \"-u\", user, \"https://api.github.com/user/repos\", \"-d\", \"\\\"name\\\": \\\"0\\\"\".format(repo), \"--fail\"]); check_call([\"git\", \"remote\", \"add\", \"origin\", \"git@github.com:0/1.git\".format(user, repo)]); check_call([\"git\", \"push\", \"origin\", \"master\"])'"
要使用它,请运行
$ git hub-new-repo
从本地存储库中的任何位置,并在出现提示时输入您的 Github 密码。
【讨论】:
这对我不起作用。它返回'没有这样的文件或目录' 这对我也不起作用。它返回curl: (22) The requested URL returned error: 401 Traceback (most recent call last): File "<string>", line 1, in <module> File "/usr/lib64/python3.2/subprocess.py", line 488, in check_call raise CalledProcessError(retcode, cmd) subprocess.CalledProcessError: Command '['curl', '-u', 'myusername', 'https://api.github.com/user/repos', '-d', '"name": "reponame"', '--fail']' returned non-zero exit status 22
python 的使用有点多,并且以额外的反斜杠和其他标点符号的形式添加了很多噪音。我只用 bash 制作了一个版本:***.com/a/28924077/1423157【参考方案22】:
我为此使用 GitHub 和 BitBucket 的 REST API 编写了一个名为 Gitter 的漂亮脚本:
https://github.com/dderiso/gitter
比特桶:
gitter -c -r b -l javascript -n node_app
GitHub:
gitter -c -r g -l javascript -n node_app
-c
= 创建新仓库
-r
= 存储库提供者(g = GitHub,b = BitBucket)
-n
= 为 repo 命名
-l
=(可选)在 repo 中设置应用的语言
【讨论】:
【参考方案23】:有关创建令牌的说明,请转至 here 这是您将键入的命令(截至本回答日期。(替换所有 CAPS 关键字):
curl -u 'YOUR_USERNAME' -d '"scopes":["repo"],"note":"YOUR_NOTE"' https://api.github.com/authorizations
输入密码后,您将看到以下内容,其中包含您的令牌。
"app":
"name": "YOUR_NOTE (API)",
"url": "http://developer.github.com/v3/oauth/#oauth-authorizations-api"
,
"note_url": null,
"note": "YOUR_NOTE",
"scopes": [
"repo"
],
"created_at": "2012-10-04T14:17:20Z",
"token": "xxxxx",
"updated_at": "2012-10-04T14:17:20Z",
"id": xxxxx,
"url": "https://api.github.com/authorizations/697577"
您可以随时通过here撤销您的令牌
【讨论】:
【参考方案24】:我认为有一个official github gem 可以做到这一点。随着我的学习,我会尝试添加更多信息,但我才刚刚发现这个宝石,所以我还不太了解。
更新:设置我的 API 密钥后,我可以通过 create
命令在 github 上创建一个新的 repo,但是我无法使用 create-from-local
命令,它应该采用当前的本地 repo并在github上做一个对应的remote。
$ gh create-from-local
=> error creating repository
如果有人对此有所了解,我很想知道我做错了什么。已经有一个issue filed。
更新:我最终确实让它工作了。我不确定如何重现该问题,但我只是从头开始(删除了 .git 文件夹)
git init
git add .emacs
git commit -a -m "adding emacs"
现在这一行将创建远程仓库,甚至推送到它,但不幸的是,我认为我无法指定我想要的仓库的名称。我希望它在 github 上被称为“dotfiles”,但是 gh gem 只使用了当前文件夹的名称,因为我在我的主文件夹中,所以它是“jason”。 (我添加了a ticket 询问所需的行为)
gh create-from-local
另一方面,这个命令确实接受一个参数来指定远程仓库的名称,但它的目的是从头开始一个新项目,即在你调用这个命令之后,你会得到一个正在跟踪的新远程仓库相对于您当前位置的新创建子文件夹中的本地存储库,两者的名称都指定为参数。
gh create dotfiles
【讨论】:
这个项目已经好几年没有任何工作了,对我没有用,而且正如here 所暗示的那样,已经死了。正如this answer 中所建议的,它显然已被hub 工具取代。以上是关于是否可以在不打开浏览器的情况下从 CLI 在 GitHub 上创建远程存储库?的主要内容,如果未能解决你的问题,请参考以下文章
如何在不打开电子邮件应用程序的情况下从锚标签中抓取电子邮件 ID