我嘗試將目錄及其所有歷史記錄從存儲庫移動到另一個存儲庫。將git子樹移動到不同的存儲庫中
解壓縮目錄的完整歷史是容易git subtree split
。
這創建了一個新的分支,可以很容易地將其提取到其他存儲庫。
現在我用git subtree add
到目錄粘貼到第二個庫。
如果我看gitk
或git log --decorate --graph
一切都看起來不錯。所有提交按預期呈現。所有文件也按預期呈現。
但是,當我嘗試使用git log -- transplanted_dir/somefile
查看移植文件的歷史記錄時,我只看到git subtree add
產生的一個「合併」提交。
爲什麼我看到上面gitk的提交,而不是在日誌中的單個文件?
如果我做一個簡單git merge
,我可以看到每個文件的歷史記錄,但這些文件會,當然不是生活在一個子文件夾。
將移動的提交集成到其他存儲庫的正確方法是什麼?
詳細的示例命令再現的情況:
#create two repositories:
git init a
git init b
# create directory dir with some history
cd a
mkdir dir
echo 1 > dir/file
git add .
git commit -am 1
echo 2 > dir/file
git commit -am 2
echo 3 > dir/file
echo 3 > otherfile
git add .
git commit -am 3
#split subtree
git subtree split --prefix dir -b split
#create a commit on repo b
cd ../b
mkdir otherdir
touch otherdir/file
git add .
git commit -am init
#fetch split branch of repo a
git fetch ../a split
git co -b split FETCH_HEAD
git log --decorate --graph --name-status
git co master
# add commits to repo b
git subtree add --prefix somedir split
# this looks fine:
git log --decorate --graph --name-status
# no history here - Why?
git log --decorate --graph --name-status somedir/file
git log --decorate --graph --name-status --follow somedir/file
當您移動文件時,您將其重命名。我很確定沒有參數的'git log'只是在重命名時停止;在更早的時候,該文件不存在。 – matt 2013-05-06 17:08:21
不,沒有重命名。 「合併」提交只是添加新文件。 – michas 2013-05-06 18:09:02
@michas將'foo/bar/baz'移動到'bar/baz'屬於重命名。 'git log --follow'的輸出是什麼? – gcbenison 2013-05-06 18:25:55