[英]How to convert to GIT an old SVN repository with trunk/branches created later
我正在嘗試將一個非常舊的 SVN 存儲庫遷移到 GIT 維護歷史記錄,但請記住,存儲庫並不是一直都有主干/分支/標簽結構,而是在沒有它們的情況下創建的,並且存儲庫是稍后遷移到主干/分支/標簽結構。
我已經嘗試使用 git-svn 使用以下命令:
git svn clone <repo_url> --stdlayout
但問題是歷史在“創建的主干、分支和標簽”提交時被刪除,因此在該提交之前的所有內容都丟失了。 我也嘗試過:
git svn clone <repo_url> -T/ -bbranches -ttags
它獲取所有提交,但在提交圖中創建了一個真實的網格,因為它復制了分支和主干中的提交,並且不會在主分支和分支之間創建任何關系。 我嘗試使用以下命令對其進行清理:
git filter-branch -f --index-filter "git rm -rf --cached --ignore-unmatch branches tags" -- --all
它從主干分支中刪除了分支文件夾,大部分是正確的,(並刪除了許多重復的提交)並且還嘗試將主干文件夾移動到根目錄:
git filter-branch --tree-filter "if test -d 'trunk'; then git mv trunk/\* .; fi" --tag-name-filter cat --prune-empty -- --all
但不起作用。 我正在使用 Windows,因此 git-svn 文檔中用於移動所有項目的命令對我不起作用(缺少 sed):
git filter-branch --index-filter \
'git ls-files -s | sed "s-\t\"*-&newsubdir/-" |
GIT_INDEX_FILE=$GIT_INDEX_FILE.new \
git update-index --index-info &&
mv "$GIT_INDEX_FILE.new" "$GIT_INDEX_FILE"' HEAD
(我重寫為:)
git filter-branch --index-filter \
'git ls-files -s | sed "s-\t\"trunk/\(*\)-\1-" |
GIT_INDEX_FILE=$GIT_INDEX_FILE.new \
git update-index --index-info &&
mv "$GIT_INDEX_FILE.new" "$GIT_INDEX_FILE"' HEAD
知道我正在嘗試做的事情是否可行,還是應該退出並僅保留歷史記錄,直到創建主干/分支/標簽?
我終於找到了一個解決方案:使用 svn-all-fast-export (svn2git) 我必須使用以下腳本創建一個包含所有歷史記錄的存儲庫:
create repository REPONAME
end repository
# Master branch
match /
repository REPONAME
max revision REVISION_BEFORE_TRUNK_BRANCHES_TAGS_CREATION
branch master
end match
match /trunk/
repository REPONAME
branch master
end match
# Common branches
match /branches/([^/]+)/
repository REPONAME
branch \1
end match
# Ignore everything else
match /
end match
當我在 Windows 上時,必須在 Windows Substime for Linux 上編譯,安裝“build-essential subversion git qtchooser qt5-default libapr1 libapr1-dev libsvn-dev”; 或帶有以下庫的 cygwin(如本期所述)
gcc-g++ (v7.4.0-1)
libQt5Core-devel (v5.9.4-2)
libapr1 (v1.6.5-1)
libapr1-devel (v1.6.5-1)
make (v4.2.1-2)
subversion (v1.11.1-1)
subversion-devel (v1.11.1-1)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.