您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關(guān) OpenStack開(kāi)發(fā)過(guò)程中常用Git操作場(chǎng)景是怎樣的,小編覺(jué)得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說(shuō),跟著小編一起來(lái)看看吧。
雖然對(duì)原理也算熟,用得也算多,但一段時(shí)間不用還是容易忘,下面記下一些日常工作場(chǎng)景常用到的命令:
場(chǎng)景一:如何往社區(qū)提交一個(gè)Bug
安裝git: sudo yum install git git-review
下載代碼:git clone https://github.com/openstack/neutron.git
1 通過(guò)ssh-keygen命令創(chuàng)建密鑰, 然后在“https://review.openstack.org/#/settings/ssh-keys 界面設(shè)置public key.
2 運(yùn)行“git review -s”命令設(shè)置git-review, 這步會(huì)在.git/config文件中添加一個(gè)名為gerrit的遠(yuǎn)程分支ssh://zhhuabj@review.openstack.org:29418/openstack/neutron.git,并且可以通過(guò)ssh訪問(wèn):ssh -p 29418 review.openstack.org)
如果報(bào)“Permission denied (publickey)”這樣的錯(cuò)的話,簡(jiǎn)單運(yùn)行"ssh-add"命令將ssh key添加到ssh agent即可
3 如果想要修改一個(gè)bug時(shí),先創(chuàng)建一個(gè)本地分支,
git checkout -b task/132002
4 寫(xiě)完代碼之后,也得運(yùn)行一下pep8測(cè)試吧
pep8 --count --repeat --show-source . 或者 ./run_tests.sh -p -N
5 或者也運(yùn)行一下單元測(cè)試吧
nosetests -s -v test_backend_sql.py && nosetests -s -v test_db_plugin:TestNetworksV2.test_list_shared_networks_with_non_admin_user
或者 python -m testtools.run neutron.tests.unit.test_security_groups_rpc
或者 python setup.py testr --slowest --testr-args='--subunit neutron.tests.unit.test_security_groups_rpc' | subunit2pyunit
或者 ./run_test.sh -N testtools.run neutron.tests.unit.test_security_groups_rpc
6 提交代碼到本地庫(kù)
git add -u (修改的文件), 若創(chuàng)建了新文件 git add -i
git commit
提交信息的格式一般如下,一般分三段,第一段是標(biāo)準(zhǔn)說(shuō)清楚你要做什么,如果你在改hyper-v模塊最好有hyper-v的字眼,這樣大家在收到郵件時(shí)只看標(biāo)題就知道你在做什么了,這很重要;第二段簡(jiǎn)短描述;第三段一般使用“Fixed bug #161317",#號(hào)很重要,這樣會(huì)自動(dòng)在gerrit上鏈接到bug上。
Add documentation for upgrading hyperv OpenStack compute node
This guide covers how to upgrade and configure hyperv OpenStack
compute node from Grizzly to Havana
Fixed bug #161317
如果是延用上次提交的信息使用命令:git commit --amend
7 本來(lái)在git review通過(guò)后gerrit會(huì)自動(dòng)rebase到master分支的,但是有沖突的話沒(méi)人幫你改,所以自己在git review前最好在本地做一個(gè)rebase操作,有沖突及時(shí)改:
git rebase master 有沖突再解決沖突之后繼續(xù)執(zhí)行:git rebase --continue
8 提交代碼評(píng)審
git review 或者 git review master
這時(shí)會(huì)在gerrit服務(wù)器上創(chuàng)建一個(gè)本地分支:refs/for/master/task/132002, 如果上面改bug時(shí)不建分支的話,這里就變成了: refs/for/master,下一個(gè)人提交直接就被沖掉了。
9 如果社區(qū)上的jenkins出錯(cuò),確定不是你自己的代碼造成的,可以回復(fù)“recheck no bug” 觸發(fā)重新檢查,或者"recheck bug ###"
10 說(shuō)說(shuō)依賴(lài)提交,例如如果一個(gè)patch在社區(qū)已經(jīng)被很多人+1了,但這時(shí)候有人希望提交一個(gè)相關(guān)的其他patch, 你當(dāng)然不想破壞這么多已經(jīng)+1的成果,所以你會(huì)希望再提一個(gè)patch但它會(huì)依賴(lài)前一個(gè)patch。注意兩點(diǎn):生成一個(gè)新的gerrit評(píng)審頁(yè)是由Change-Id決定的;而是否在一個(gè)評(píng)審頁(yè)上產(chǎn)生一個(gè)新的change set去破壞+1是由commit id決定的。所以只要保證前一個(gè)patch的commit id不變就行了,然后在這個(gè)基礎(chǔ)上再提交一個(gè)patch再git review即可。當(dāng)然,在git review之前最好先git rebase一下,不然如果本地git rebase的話就會(huì)產(chǎn)生一個(gè)新的commit id這樣同樣會(huì)產(chǎn)生一個(gè)新的change set,不過(guò)gerrit還比較智能,那些+1會(huì)自動(dòng)添加上(Automatically re-added by Gerrit trivial rebase detection script.), 一個(gè)例子見(jiàn):https://review.openstack.org/#/c/51375/
場(chǎng)景二:如何rebase代碼
git rebase用于在一個(gè)分支中合并另一分支,舉個(gè)例子,一家公司想要用OpenStack做二次開(kāi)發(fā)的話,
在公司內(nèi)部的git庫(kù)里創(chuàng)建了三個(gè)分支:my-master, my-grizzly, my-havana
OpenStack的git庫(kù)里的分支叫: github-master, github-grizzly, github-havana
現(xiàn)在大家把內(nèi)部代碼都提交在my-havana分支,那么也需要時(shí)不時(shí)將社區(qū)的github-havana的代碼rebase合并到my-havana分支中
1,首先在.git/config里要有兩個(gè)remote分支,一個(gè)指向內(nèi)部的版本庫(kù),一個(gè)指向github的版本庫(kù),如.git/config的相應(yīng)配置如下:
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
[remote "my-origin"]
fetch = +refs/heads/*:refs/remotes/my-origin/*
url = git://<your_ip>/neutron.git
[remote "github-origin"]
fetch = +refs/heads/*:refs/remotes/github-origin/*
url = https://github.com/openstack/neutron.git
[branch "master"]
remote = my-origin
merge = refs/heads/master
[branch "my-havana"]
remote = my-origin
merge = refs/heads/my-havana
[branch "my-grizzly"]
remote = my-origin
merge = refs/heads/my-grizzly
2, 更新上面所有的remote分支 git remote update
3, 因?yàn)槭且獙⑸鐓^(qū)的havana分支的代碼同步到自己havana分支,所以為兩個(gè)遠(yuǎn)程分支創(chuàng)建對(duì)應(yīng)的本地分支
git checkout -b github-havana github/stable/havana
git checkout -b my-havana origin/my-havana
4, 合并,成功后應(yīng)該用git log -1能看到一個(gè)新的合并提交。如果有沖突的話就解決沖突再git merge next
git checkout my-havana
git merget github-havana
5, 運(yùn)行單元測(cè)試
tox --recreate -e py27,pep8
./run_tests.sh -V -f
6, 用-n參數(shù)(dry-run)測(cè)試提交, 提交到名為my-origin的遠(yuǎn)程分支的my-havana分支中:
git push -n my-origin HEAD:refs/heads/my-havana
若沒(méi)有問(wèn)題的話真正提交:
git push my-origin HEAD:refs/heads/my-havana
場(chǎng)景三:cherry pick代碼
例如,一個(gè)社區(qū)bug 1161195被提交到master分支, 社區(qū)沒(méi)有批準(zhǔn)進(jìn)stable-havana分支,或者來(lái)不及等它進(jìn),這時(shí)候公司內(nèi)部要求進(jìn)my-havana分支的話,可以將這個(gè)bug通過(guò)cherry pick合并過(guò)來(lái)。
1, 為這個(gè)任務(wù)創(chuàng)建一個(gè)bug.
git checkout stable-havana
git pull
git checkout -b bug/1161195
2, 在社區(qū)找到bug 1161195的代碼提交id, 如:5f3fa391ed499750ad68ad5b000b4e2e0a86978e
可以通過(guò) git log |grep -B 30 <commit-id>查看確認(rèn)
3, 在bug/1161195分支上執(zhí)行cherry pick命令:
git cherry-pick -x <commit-id>
4, 提交代碼評(píng)審
git commit or git commit --amend
git review stable-havana
場(chǎng)景四:將git產(chǎn)生的patch變成和svn兼容
#!/bin/sh
#
# git-svn-diff
# Generate an SVN-compatible diff against the tip of the tracking branch
REV=`git svn find-rev $(git rev-list --date-order --max-count=1 master)`
git diff --no-prefix $(git rev-list --date-order --max-count=1 master) $* |sed -e "s/^+++ .*/& (working copy)/" \
-e "s/^--- .*/& (revision $REV)/" \
-e "s/^diff --git [^[:space:]]*/Index:/" -e "s/^index.*/===================================================================/"
在本機(jī)上創(chuàng)建一個(gè)共享的git庫(kù):
sudo groupadd git
sudo useradd -d /home/git -m -g git git
sudo passwd git
su - git
mkdir /home/git/patent.git
cd patent.git/
git init --bare --shared
# test in another directory
cd /bak/tmp
git clone git@9.123.136.122:/home/git/patent.git
cd patent
cp test.doc .
git add test.doc
git commit -m "init commit"
git push origin master
這時(shí)候肯定是希望大家通過(guò)git用戶(hù)可以訪問(wèn)git庫(kù),但又不希望他們通過(guò)ssh登錄這臺(tái)機(jī)器,所以修改/etc/passwd文件,
將 “ git:x:502:503::/home/git:/bin/bash ”
改成:git:x:502:503::/home/git:/usr/bin/git-shell
這時(shí)候還需要將每個(gè)客戶(hù)端的公鑰加到/home/git/.ssh/authorized_keys文件里,公鑰可以通過(guò)ssh-keygen -t rsa生成。
場(chǎng)景五,使用git命令操作bzr與hg
sudo apt-get install mercurial python-hglib
wget https://raw.githubusercontent.com/felipec/git-remote-hg/master/git-remote-hg
wget https://raw.githubusercontent.com/felipec/git-remote-bzr/master/git-remote-bzr
sudo chmod 755 ./git-remote-*
sudo mv git-remote-* /usr/bin
examples:
git clone "bzr::lp:ubuntu/ifupdown"
git clone "bzr::lp:debian/ifupdown"
git clone "hg::http://anonscm.debian.org/hg/collab-maint/ifupdown/"
場(chǎng)景六,依賴(lài)提交
有一種情況,我向社區(qū)同時(shí)提交了兩個(gè)有依賴(lài)的提交,在本地提交這兩個(gè)提交之后直接git review即可。
現(xiàn)在前一個(gè)提交(假設(shè)提交id為:187f)要修改,怎么辦呢?
a, git rebase 187f^ --interactive, 回到要修改的提交的前一個(gè)點(diǎn)上
b, 修改那個(gè)提交,最后git commit --amend
c, git rebase --continue, 繼續(xù)變基并且返回到原來(lái)的HEAD處
如果中間出現(xiàn)“interactive rebase already started”, 用“git rebase -i --abort”命令重來(lái)。
其它命令:
git reset HEAD~1 撤銷(xiāo)最后一次提交。
git reset --hard HEAD^ 撤銷(xiāo)最后一次提交并清除本地修改
git reset --hard Merge_Head 和服務(wù)器保持一致
git clean -dfx 刪除本地未在版本庫(kù)的東西
git stash & git stash list & git stash pop 暫存代碼
git rebase -i --abort
以上就是 OpenStack開(kāi)發(fā)過(guò)程中常用Git操作場(chǎng)景是怎樣的,小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見(jiàn)到或用到的。希望你能通過(guò)這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。