我有一个git存储库projectA
,其目录如下:
projectA
/dir1
/dir2
/dir3
/dir4
dir1,dir2,dir3和dir4都包含多个文件和更深层次的子目录。
我想将dir1和dir2及其所有内容移动到新的git存储库projectB
中,并保留与这些文件相关的提交历史记录。通过使用gitk --follow dir1/somefile
,我可以跟踪文件的历史记录,即使它已被重命名/移动。
projectA
/dir3
/dir4
projectB
/dir1
/dir2
我首先尝试将dir1和dir2收集到一个目录中,并使用filter-branch like this获取仅包含这些文件的新存储库。我最终得到了正确的文件,但是保留的唯一历史记录是收集dir1和dir2的最终提交。所以看起来这个方法不会保留任何连接到这些文件以前的名称/路径的提交。
我尝试使用different filter-branch方法:
git filter-branch --index-filter 'git rm --cached -qr --ignore-unmatch -- . && git reset -q $GIT_COMMIT -- dir1 dir2' --prune-empty -- --all
这产生了与第一个相同的结果。
我尝试按照here解释使用子树。计划是将目录提取为新分支,然后使用该新分支创建projectB repo:
git subtree split --prefix=dir1 -b projectb
我再次得到一个新的分支,其中只包含每个文件的姓氏/路径的提交。
为了清楚起见,除了将dir1和dir2收集到一个目录中之外,这些目录中的文件之前已经多次重命名/移动,并且需要保留此历史记录。