[英]Converting big bzr repository to git, what to expect?
我正在嘗試將一些舊的集市存儲庫轉換為git,雖然一切似乎都順利進行,但我有點不確定它是否真的像它聲稱的那樣好。
我的bazaar存儲庫結構如下:
我正在使用快速導出/快速導入方法在bzr和git之間進行遷移。
最初,我使用--export-marks遷移“trunk”,如下所示:
bzr fast-export --export-marks=../$1/marks.bzr ../$1/trunk | git fast-import --export-marks=../$1/marks.bzr --export-marks=../$1/marks.git
以1美元為名稱
然后迭代“repo”目錄中的所有其他文件夾並調用
bzr fast-export --marks=../$1/marks.bzr --git-branch=$nick ../$1/$b/.. | git fast-import --import-marks=../$1/marks.git --export-marks=../$1/marks.git
$ nick是bzr的分支昵稱,$ 1 / $ b是分支的目錄名稱。
正如我所說,它處理所有預期的目錄,但在完成后,我做了一個
git branch
它顯示了20個分支,原始的集市存儲庫有80多個。
現在,只是在git中查看“master”,它似乎就在那里,缺少的60個分支很容易成為已經合並到trunk中的分支。 但我不確定快速導出/快速導入工具是否足夠巧妙地說“呸 - 你不會需要這個”,但也許它們是。
有人對這個有經驗么?
在從bzr遷移到git之后,我是否應該留下“master”和任何已經在其中保留未提交的分支?
最后,為了歷史,有沒有辦法強迫所有分支轉換,即使它們在技術上已經不存在了?
似乎快速導入/導出工具確實足夠聰明地說“呸 - 你不會需要這個” 。 這不是火箭科學,就像git branch -d
知道什么時候刪除分支一樣安全,所以git fast-import
知道傳入的分支是副本。
但是你可能會非常肯定 ,我同意。 我整理了一個簡單的(如果效率低下)腳本來查找唯一的bzr
分支列表:
#!/bin/sh
paths=$(bzr branches -R)
for path1 in $paths; do
merged=
for path2 in $paths; do
test $path1 = $path2 && continue
# is path1 part of path2 ?
if bzr missing -d $path1 $path2 --mine >/dev/null; then
# is path2 part of path1 ?
if bzr missing -d $path1 $path2 --other >/dev/null; then
echo "# $path1 == $path2"
else
merged=1
break
fi
fi
done
test "$merged" || echo $path1
done
在Bazaar共享存儲庫中運行它。 它找到所有分支,然后將所有分支與所有其他分支進行比較。 如果A在B中,那么有兩種可能性:也許B也是A,這意味着A == B.否則A實際上是多余的。
該腳本過濾掉完全合並到至少一個其他分支的分支。 但是,如果有多個相同的分支,則會打印所有這些分支,其他行以#
開頭,表示它們是相同的。
您的示例命令使用bzr fast-export ... | git fast-import ...
bzr fast-export ... | git fast-import ...
似乎有一些不必要的選擇。 按照bzr fast-export -h
末尾的示例,我建議使用這些步驟:
創建一個全新的Git倉庫:
git init /tmp/gitrepo
進入您的Bazaar共享倉庫:
cd /path/to/bzr/shared/repo
將主分支(trunk?)遷移為主分支:
bzr fast-export --export-marks=marks.bzr trunk/ | \\ GIT_DIR=/tmp/gitrepo/.git/ git fast-import --export-marks=marks.git
遷移所有分支:
bzr branches -R | while read path; do nick=$(basename $path) echo migrating $nick ... bzr fast-export --import-marks=marks.bzr -b $nick $path | \\ GIT_DIR=/tmp/gitrepo/.git git fast-import --import-marks=marks.git \\ &>/tmp/migration.log done
如果您注意到最后一步沒有檢查您已遷移的主干。 沒關系,因為它無論如何都不會再次導入它。 另請注意,即使branchA完全合並到branchB中 , 如果首先看到它,也會在Git中創建它 。 如果首先看到branchB ,那么將不會在Git中創建branchA ( “bah - 你不需要這個” )。
導入到Git時,我找不到強制創建相同分支的方法。 我不認為這是可能的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.