“Github”里的“hub”改用Go語言開發

jopen 9年前發布 | 14K 次閱讀 Github

剛剛過去的2014年是Go語言重要的一年,不僅版本升級到了1.4,而且Go語言的集成開發環境LiteIDE也發布了x26,還在云計算方便吸引力不是的注意力。雖然有很多程序員不喜歡Go語言,但每種語言都有直接的缺點和優點,這是很正常的事情。最重要的是取之長、補己短。最近github宣布使用Go1.4重新開發了hub命令,就是要利用Go語言的長處。

Github是世界上最大的代碼托管服務,它是在于最近幾年迅速超過了SoruceForge,很大程度上得益于Linux創始人Linus的影響力,和Git中去中心化的思想。相信很多人都使用過git和github,但估計很少人知道這個等式:git + hub = github,hub是一個用來封裝git的工具,為其擴展更多的功能和特性,是GitHub運行起來更加快捷方便。

$ hub clone rtomayko/tilt

# expands to:
$ git clone git://github.com/rtomayko/tilt.git

hub命令的最佳使用方法是當作git的別名,這樣,當你輸入$ git <command>時,你不僅能獲得git的所有功能,而且能增添很多附加特性。設置別名的方法是在你的.bash_profile文件放置下一行代碼:

eval "$(hub alias -s)"

從2.2.0版本開始,hub開始改用Go語言開發,主要原因是Go語言的高效。要想從源代碼安裝hub2.x版本,你需要有一個Go語言開發環境,版本要在1.4以上:

$ git clone https://github.com/github/hub.git
$ cd hub
$ ./script/build
$ cp hub YOUR_BIN_PATH

hub2.x版本將對1.x版本保持最大的兼容。下面我里看一下hub命令提供了哪些額外的強大功能。

(下面這些代碼中假設你已經做了git別名設置)

git clone

$ git clone schacon/ticgit
> git clone git://github.com/schacon/ticgit.git

$ git clone -p schacon/ticgit
> git clone git@github.com:schacon/ticgit.git

$ git clone resque
> git clone git@github.com/YOUR_USER/resque.git

git remote add

$ git remote add rtomayko
> git remote add rtomayko git://github.com/rtomayko/CURRENT_REPO.git

$ git remote add -p rtomayko
> git remote add rtomayko git@github.com:rtomayko/CURRENT_REPO.git

$ git remote add origin
> git remote add origin git://github.com/YOUR_USER/CURRENT_REPO.git

git fetch

$ git fetch mislav
> git remote add mislav git://github.com/mislav/REPO.git
> git fetch mislav

$ git fetch mislav,xoebus
> git remote add mislav ...
> git remote add xoebus ...
> git fetch --multiple mislav xoebus

git cherry-pick

$ git cherry-pick http://github.com/mislav/REPO/commit/SHA
> git remote add -f mislav git://github.com/mislav/REPO.git
> git cherry-pick SHA

$ git cherry-pick mislav@SHA
> git remote add -f mislav git://github.com/mislav/CURRENT_REPO.git
> git cherry-pick SHA

$ git cherry-pick mislav@SHA
> git fetch mislav
> git cherry-pick SHA

git am, git apply

$ git am https://github.com/defunkt/hub/pull/55
[ downloads patch via API ]
> git am /tmp/55.patch

$ git am --ignore-whitespace https://github.com/davidbalbert/hub/commit/fdb9921
[ downloads patch via API ]
> git am --ignore-whitespace /tmp/fdb9921.patch

$ git apply https://gist.github.com/8da7fb575debd88c54cf
[ downloads patch via API ]
> git apply /tmp/gist-8da7fb575debd88c54cf.txt

git fork

$ git fork
[ repo forked on GitHub ]
> git remote add -f YOUR_USER git@github.com:YOUR_USER/CURRENT_REPO.git

git pull-request

# while on a topic branch called "feature":
$ git pull-request
[ opens text editor to edit title & body for the request ]
[ opened pull request on GitHub for "YOUR_USER:feature" ]

# explicit title, pull base & head:
$ git pull-request -m "Implemented feature X" -b defunkt:master -h mislav:feature

git checkout

$ git checkout https://github.com/defunkt/hub/pull/73
> git remote add -f -t feature mislav git://github.com/mislav/hub.git
> git checkout --track -B mislav-feature mislav/feature

$ git checkout https://github.com/defunkt/hub/pull/73 custom-branch-name

git merge

$ git merge https://github.com/defunkt/hub/pull/73
> git fetch git://github.com/mislav/hub.git +refs/heads/feature:refs/remotes/mislav/feature
> git merge mislav/feature --no-ff -m 'Merge pull request #73 from mislav/feature...'

git create

$ git create
[ repo created on GitHub ]
> git remote add origin git@github.com:YOUR_USER/CURRENT_REPO.git

# with description:
$ git create -d 'It shall be mine, all mine!'

$ git create recipes
[ repo created on GitHub ]
> git remote add origin git@github.com:YOUR_USER/recipes.git

$ git create sinatra/recipes
[ repo created in GitHub organization ]
> git remote add origin git@github.com:sinatra/recipes.git

git init

$ git init -g
> git init
> git remote add origin git@github.com:YOUR_USER/REPO.git

git push

$ git push origin,staging,qa bert_timeout
> git push origin bert_timeout
> git push staging bert_timeout
> git push qa bert_timeout

git browse

$ git browse
> open https://github.com/YOUR_USER/CURRENT_REPO

$ git browse -- commit/SHA
> open https://github.com/YOUR_USER/CURRENT_REPO/commit/SHA

$ git browse -- issues
> open https://github.com/YOUR_USER/CURRENT_REPO/issues

$ git browse -- issues/10
> open https://github.com/YOUR_USER/CURRENT_REPO/issues/10

$ git browse schacon/ticgit
> open https://github.com/schacon/ticgit

$ git browse schacon/ticgit commit/SHA
> open https://github.com/schacon/ticgit/commit/SHA

$ git browse resque
> open https://github.com/YOUR_USER/resque

$ git browse resque network
> open https://github.com/YOUR_USER/resque/network

git compare

$ git compare refactor
> open https://github.com/CURRENT_REPO/compare/refactor

$ git compare 1.0..1.1
> open https://github.com/CURRENT_REPO/compare/1.0...1.1

$ git compare -u fix
> (https://github.com/CURRENT_REPO/compare/fix)

$ git compare other-user patch
> open https://github.com/other-user/REPO/compare/patch

git submodule

$ git submodule add wycats/bundler vendor/bundler
> git submodule add git://github.com/wycats/bundler.git vendor/bundler

$ git submodule add -p wycats/bundler vendor/bundler
> git submodule add git@github.com:wycats/bundler.git vendor/bundler

$ git submodule add -b ryppl --name pip ryppl/pip vendor/pip
> git submodule add -b ryppl --name pip git://github.com/ryppl/pip.git vendor/pip

git ci-status

$ git ci-status [commit]
> (prints CI state of commit and exits with appropriate code)
> One of: success (0), error (1), failure (1), pending (2), no status (3)

git help

$ git help
> (improved git help)
$ git help hub
> (hub man page)

(程序師網原創,CC licensed)

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!