簡體   English   中英

將大bzr存儲庫轉換為git,可以期待什么?

[英]Converting big bzr repository to git, what to expect?

我正在嘗試將一些舊的集市存儲庫轉換為git,雖然一切似乎都順利進行,但我有點不確定它是否真的像它聲稱的那樣好。

我的bazaar存儲庫結構如下:

  • 回購
    • 樹干
    • 特性/功能branchX
    • 特性/功能枝

我正在使用快速導出/快速導入方法在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末尾的示例,我建議使用這些步驟:

  1. 創建一個全新的Git倉庫:

     git init /tmp/gitrepo 
  2. 進入您的Bazaar共享倉庫:

     cd /path/to/bzr/shared/repo 
  3. 將主分支(trunk?)遷移為主分支:

     bzr fast-export --export-marks=marks.bzr trunk/ | \\ GIT_DIR=/tmp/gitrepo/.git/ git fast-import --export-marks=marks.git 
  4. 遷移所有分支:

     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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM