通常情况下,在本地新建一个仓库之后,需要在远端网页端也新建一个空的同名仓库,然后将两者进行关联才能推送。
那有没有办法直接在命令行就完成从新建到推送的过程而不需要中间在网页端也操作一番呢?办法当然是有的。
下面以一个示例来说明一下。
1. 准备测试文件
首先做一些文件的准备,作为此次实验新建的本地仓库 gittest 以及新建本地文件 README.md 并向此文件写入 # git test 的内容,当前文件夹目录结构为 tree 指令结果所示。
$ mkdir gittest $ cd gittest $ touch README.md $ echo "# git test" >> README.md $ tree . . └── README.md
2. 初始化本地仓库
对本地仓库进行初始化
$ git init $ git add README.md $ git commit -m "update README"
提交时如果出现下面的提示,表示我们需要首先认证自己的身份,以向项目表明是谁在提交。
*** Please tell me who you are. Run git config --global user.email "you@example.com" git config --global user.name "Your Name" to set your account's default identity. Omit --global to set the identity only in this repository.
根据提示操作即可,如下示例。
$ git config --global user.email "phillee2016@163.com" $ git config --global user.name "philleer" $ git commit -m "update README"
至此本地仓库已经建立完成,并且修改保存到 stage 当中。
3. 本地新建远程仓库
正常的流程是登陆 GitHub,在右上角点击 New,新建一个远程仓库,然后再本地通过 git remote add origin https://github.com/philleer/gittest.git 将已有的本地仓库与之关联,然后将本地仓库内容推送到GitHub上。
现在我们通过命令行来实现这一操作。
$ curl -u 'philleer' https://api.github.com/user/repos -d '{"name":"gittest"}'
只需要把上面命令行中的 philleer 改成自己的用户名,gittest 改成自己的新建仓库名。
此时会让你输入登陆密码,按指示输入即可。
Enter host password for user 'philleer':
输入之后回车确认,出现下面的结果表示已经新建成功。
{ "id": 183884632, "node_id": "MDEwOlJlcG9zaXRvcnkxODM4ODQ2MzI=", "name": "gittest", "full_name": "philleer/gittest", "private": false, "owner": { "login": "philleer", "id": 22950478, "node_id": "MDQ6VXNlcjIyOTUwNDc4", "avatar_url": "https://avatars1.githubusercontent.com/u/22950478?v=4", "gravatar_id": "", "url": "https://api.github.com/users/philleer", "html_url": "https://github.com/philleer", "followers_url": "https://api.github.com/users/philleer/followers", "following_url": "https://api.github.com/users/philleer/following{/other_user}", "gists_url": "https://api.github.com/users/philleer/gists{/gist_id}", "starred_url": "https://api.github.com/users/philleer/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/philleer/subscriptions", "organizations_url": "https://api.github.com/users/philleer/orgs", "repos_url": "https://api.github.com/users/philleer/repos", "events_url": "https://api.github.com/users/philleer/events{/privacy}", "received_events_url": "https://api.github.com/users/philleer/received_events", "type": "User", "site_admin": false }, "html_url": "https://github.com/philleer/gittest", "description": null, "fork": false, "url": "https://api.github.com/repos/philleer/gittest", "forks_url": "https://api.github.com/repos/philleer/gittest/forks", "keys_url": "https://api.github.com/repos/philleer/gittest/keys{/key_id}", "collaborators_url": "https://api.github.com/repos/philleer/gittest/collaborators{/collaborator}", "teams_url": "https://api.github.com/repos/philleer/gittest/teams", "hooks_url": "https://api.github.com/repos/philleer/gittest/hooks", "issue_events_url": "https://api.github.com/repos/philleer/gittest/issues/events{/number}", "events_url": "https://api.github.com/repos/philleer/gittest/events", "assignees_url": "https://api.github.com/repos/philleer/gittest/assignees{/user}", "branches_url": "https://api.github.com/repos/philleer/gittest/branches{/branch}", "tags_url": "https://api.github.com/repos/philleer/gittest/tags", "blobs_url": "https://api.github.com/repos/philleer/gittest/git/blobs{/sha}", "git_tags_url": "https://api.github.com/repos/philleer/gittest/git/tags{/sha}", "git_refs_url": "https://api.github.com/repos/philleer/gittest/git/refs{/sha}", "trees_url": "https://api.github.com/repos/philleer/gittest/git/trees{/sha}", "statuses_url": "https://api.github.com/repos/philleer/gittest/statuses/{sha}", "languages_url": "https://api.github.com/repos/philleer/gittest/languages", "stargazers_url": "https://api.github.com/repos/philleer/gittest/stargazers", "contributors_url": "https://api.github.com/repos/philleer/gittest/contributors", "subscribers_url": "https://api.github.com/repos/philleer/gittest/subscribers", "subscription_url": "https://api.github.com/repos/philleer/gittest/subscription", "commits_url": "https://api.github.com/repos/philleer/gittest/commits{/sha}", "git_commits_url": "https://api.github.com/repos/philleer/gittest/git/commits{/sha}", "comments_url": "https://api.github.com/repos/philleer/gittest/comments{/number}", "issue_comment_url": "https://api.github.com/repos/philleer/gittest/issues/comments{/number}", "contents_url": "https://api.github.com/repos/philleer/gittest/contents/{+path}", "compare_url": "https://api.github.com/repos/philleer/gittest/compare/{base}...{head}", "merges_url": "https://api.github.com/repos/philleer/gittest/merges", "archive_url": "https://api.github.com/repos/philleer/gittest/{archive_format}{/ref}", "downloads_url": "https://api.github.com/repos/philleer/gittest/downloads", "issues_url": "https://api.github.com/repos/philleer/gittest/issues{/number}", "pulls_url": "https://api.github.com/repos/philleer/gittest/pulls{/number}", "milestones_url": "https://api.github.com/repos/philleer/gittest/milestones{/number}", "notifications_url": "https://api.github.com/repos/philleer/gittest/notifications{?since,all,participating}", "labels_url": "https://api.github.com/repos/philleer/gittest/labels{/name}", "releases_url": "https://api.github.com/repos/philleer/gittest/releases{/id}", "deployments_url": "https://api.github.com/repos/philleer/gittest/deployments", "created_at": "2019-04-28T09:10:16Z", "updated_at": "2019-04-28T09:10:16Z", "pushed_at": "2019-04-28T09:10:17Z", "git_url": "git://github.com/philleer/gittest.git", "ssh_url": "git@github.com:philleer/gittest.git", "clone_url": "https://github.com/philleer/gittest.git", "svn_url": "https://github.com/philleer/gittest", "homepage": null, "size": 0, "stargazers_count": 0, "watchers_count": 0, "language": null, "has_issues": true, "has_projects": true, "has_downloads": true, "has_wiki": true, "has_pages": false, "forks_count": 0, "mirror_url": null, "archived": false, "disabled": false, "open_issues_count": 0, "license": null, "forks": 0, "open_issues": 0, "watchers": 0, "default_branch": "master", "permissions": { "admin": true, "push": true, "pull": true }, "allow_squash_merge": true, "allow_merge_commit": true, "allow_rebase_merge": true, "network_count": 0, "subscribers_count": 0 }
示例结果
多提一句,这里还有一些其他的参数可以设置,比如对你新建的仓库的简短描述、是否设置为私人仓库(默认是public)、是否使能issue(默认true)等等,感兴趣的伙伴可以到官网查看Parameters。
文档里面还附有设置参数时的代码示例
curl \ -X POST \ -H "Accept: application/vnd.github.v3+json" \ https://api.github.com/user/repos \ -d '{"name":"name"}'
create-a-repo
4. 关联本地仓库与远程仓库
然后将本地仓库与之关联,并推送本地仓库内容。按指示输入账户密码即可。
$ git remote add origin https://github.com/philleer/gittest.git $ git push -u origin master Username for 'https://github.com': philleer Password for 'https://philleer@github.com':
Counting objects: 3, done. Delta compression using up to 4 threads. Compressing objects: 100% (2/2), done. Writing objects: 100% (3/3), 264 bytes | 0 bytes/s, done. Total 3 (delta 0), reused 0 (delta 0) To https://github.com/philleer/gittest.git * [new branch] master -> master Branch master set up to track remote branch master from origin.
这样就完成了!不用每次都打开网页新建仓库,让后再回到本地进行关联了。
本地一条龙,全程无切换。
参考资料
[1] 命令行方式下在Github上新建远程仓库并PUSH https://blog.csdn.net/csm201314/article/details/78254777
[2] Create a repository for the authenticated user https://docs.github.com/en/rest/reference/repos#create-a-repository-for-the-authenticated-user