如何在创建子模块时保持嵌套子目录的git commit历史记录?

时间:2016-01-07 20:51:21

标签: git

我不确定这个特殊问题有多常见,但需要花一点时间来弄明白,所以我在这里重现这个问题。有类似的帖子,但都没有解决我特别关注的问题。

我们有一个目录结构如下的项目:

ProjectA/
  ProjectA.xcodeproj
  ProjectA/
    file1
    file2
    file3

file2和file3包含我们想要与另一个项目共享的代码,因此我创建了一个框架并使用git mv将文件移动到新框架中。目录结构现在如下所示:

  ProjectA/
  ProjectA.xcodeproj
  ProjectA/
     file1
  FrameworkB/
     FrameworkB.xcodeproj
     FrameworkB/
         file2
         file3
     FrameworkBTests/

然后我尝试使用git subtree命令创建一个git子模块,但是在添加到FrameworkB之前它没有保留file2和file3的提交历史记录,这违背了仔细移动文件的目的。

保留提交历史的舞步是什么?

1 个答案:

答案 0 :(得分:1)

为了创建新的存储库,这些是我最终提出的步骤:

(1)将repo克隆到临时目录并删除原始 repo的远程。

git clone https://github.com/my-repo/ProjectA.git
cd ProjectA
git remote rm origin

(2)使用git filter-branch --tree-filter命令将FrameworkB / FrameworkB /子目录中的所有文件向上移动一级。

git filter-branch -f --tree-filter 'shopt -s dotglob nullglob; test -d FrameworkB && mv FrameworkB/* . || :' HEAD

(3)使用同一命令的变体将FrameworkB / FrameworkB /中的文件向上移动一级。 (注意:只有在具有相同名称的嵌套目录时才需要执行此步骤 - 这在Xcode项目中很常见。)

git filter-branch -f --tree-filter 'shopt -s dotglob nullglob; test -d FrameworkB/FrameworkB && mv FrameworkB/FrameworkB/* FrameworkB/. || :' HEAD

(4)在我的情况下,我只是删除了我不想要的文件并提交了更改,因为我不太关心从提交历史中删除它们。

rm -r -f ProjectA/
rm -r -f ProjectA.xcodeproj
git commit -a -m "Remove the project files not associated with the shared framework." 

希望其他人可能会觉得这很有用。

参考文献:

http://jimmy.schementi.com/splitting-up-a-git-repo/

http://will.willandorla.com/extract-to-git-submodule