天天看點

git svn 筆記

git svn主要使用流程:

從svn倉庫初始化成本地git倉庫:

[cce lang=”bash”]

git svn clone -s svn_url

[/cce]

注意:svn_url是svn倉庫的基礎目錄,不包含trunk,branches這些目錄。這裡加上一個-s是–stdlayout的縮寫,辨別svn位址是符合标準svn目錄結構的,既有svn_url/trunk,svn_url/branches,svn_url/tags這些目錄(當然後面兩個目錄是非必須的,如果沒有,後續拉分支的時候可能會失敗)

執行後,整個svn分支上的版本都會重放一邊,git生成自己的commit記錄,如果分支送出記錄比較多,速度會比較慢的,

切換svn分支:

git checkout -b local/local_branch remotes/remote_branch

當然,切換分支之前,可以通過git branch -a或者git branch -r檢視svn上的分支,這裡顯示的分支名稱,是svn_url/branches目錄中的名字。上述切換分支的指令,會在本地建立一個git分支,然後将這個git分支的remote refs設定成遠端的svn分支。

送出本地修改:

git commit

git svn dcommit

首先本地是一個git倉庫,是以所有的修改,必須先送出到本地的git倉庫,然後git svn提供了dcommit指令,可以将本地git倉庫修改,送出到遠端的svn倉庫。

注意:執行svn dcommit之前,需要養成良好習慣,先更新svn分支改動。

更新svn分支改動:

git svn rebase

git svn沒有update的概念,因為本地可能有優先于svn倉庫。是以,需要采用類似git rebase的概念,先更新svn的送出,然後将git的本地送出重放。是以如果第一個本地送出版本就和svn版本沖突,就等着哭去吧,每次重放可能都要解決沖突,這個時候可能本次再拉一個git分支,采用merge的方式會友善一點。

上面應該是最常用的幾個git svn指令,下面是使用過程中一些特殊情況的處理:

建立svn分支:

git svn branch -m “message” branch_name

看了指令輸出就知道了,這樣其實就是執行svn copy操作。當然,需要確定svn_url/branches目錄存在,因為git svn需要知道分支路徑(當然也可以在.git/config檔案中修,但總是大家都按照規範來比較友善)。建立svn分支之後,可以再用之前的方式将本地git分支切換并關聯到這個新建立的svn分支上。

更新svn資訊:

git svn fetch

如果你的項目svn分支不是你拉的,本地git svn clone的又比較早,你會發現新建立的分支在git branch -r中不存在,也就沒法切換過去了。這個時候就需要運作git svn fetch指令,将svn倉庫變更同步下來,然後才能對新分支進行操作。

合并svn分支

git checkout master

git merge –squash git_branch_name

和之前說的一樣,合并操作需要先合并git倉庫。首先先切換到master分支(或者其他引用了svn trunk的git分支),然後進行merge。需要注意的是,merge的時候要使用squash的方式,也就是應用分支改動,但是不修改head。如果直接merge,會把目前分支的遠端svn引用也修改,變成svn分支了。然後單獨送出,最後送出到svn主幹上。

svn目錄突然變了:

前段時間配管老是改svn目錄,對應git svn引用也需要修改。git svn會在.git/config中增加[svn-remote “svn”]這麼一項,裡面包含了主幹、分支、标簽的目錄,和svn倉庫基礎目錄。如果原先引用的svn目錄變了,這裡需要做對應的修改。修改完成後,會發現無法進行git svn rebase操作了,因為遠端引用整個變了。沒辦法,隻能先進行git svn fetch,擷取新分支,然後重新從新的svn目錄中拉分支,進行修改。這樣最大的好處,是原先本地git的送出還能夠保留。

轉載自:https://coolex.info/blog/334.html