我不确定这个特殊问题有多常见,但需要花一点时间来弄明白,所以我在这里重现这个问题。有类似的帖子,但都没有解决我特别关注的问题。
我们有一个目录结构如下的项目:
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的提交历史记录,这违背了仔细移动文件的目的。
保留提交历史的舞步是什么?
答案 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."
希望其他人可能会觉得这很有用。
参考文献: