我有一个Git存储库,其中包含许多子目录.现在我发现其中一个子目录与另一个子目录无关,应该分离到一个单独的存储库.
如何在将文件的历史记录保存在子目录中的同时执行此操作?
我想我可以制作一个克隆并删除每个克隆的不需要的部分,但我想这会给我一个完整的树,当检查旧版本等.这可能是可以接受的,但我宁愿能够假装两个存储库没有共享历史记录.
为了说清楚,我有以下结构:
XYZ/
.git/
XY1/
ABC/
XY2/
Run Code Online (Sandbox Code Playgroud)
但我想这样做:
XYZ/
.git/
XY1/
XY2/
ABC/
.git/
ABC/
Run Code Online (Sandbox Code Playgroud) 这个问题基于Detach子目录到单独的Git存储库中
我想分离一对,而不是分离一个子目录.例如,我当前的目录树如下所示:
/apps
/AAA
/BBB
/CCC
/libs
/XXX
/YYY
/ZZZ
Run Code Online (Sandbox Code Playgroud)
而我想这样做:
/apps
/AAA
/libs
/XXX
Run Code Online (Sandbox Code Playgroud)
该--subdirectory-filter参数git filter-branch将无法工作,因为它在第一次运行时除去了给定目录之外的所有内容.我认为使用--index-filter所有不需要的文件的参数会起作用(尽管很乏味),但如果我尝试不止一次运行它,我会得到以下消息:
Cannot create a new backup.
A previous backup already exists in refs/original/
Force overwriting the backup with -f
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?TIA
可能重复:
如何在保留子目录的同时拆分git存储库?
有一次,我将我的代码添加到现有的git repo中,并且已经承诺了很多,因为其他开发人员已经提交到repo中的其他现有文件. 现在我想将我的代码拆分为自己的repo,但保留我的特定文件的所有更改历史记录.
通过阅读其他人为分割代码所做的工作,我正在查看filter-branch和执行--index-filter或--tree-filter使用rm命令来查找我不关心的文件.我不想使用,--subdirectory-filter因为它不适合将我的代码保存为topdir的子目录(我们也共享一个子目录).更复杂的是,原始存储库中的一些文件随着时间的推移已经移动了一些,并且有一些文件被创建然后被删除.这使得设计一个rm列表有点......具有挑战性.
我正在寻找一种方法来过滤所有/除了/文件/目录列表.有人知道这样做的方法吗?
方案如下:
我有一个很大的CVS存储库,我想转换为14个不同的git存储库.这个cvs2git过程的一部分很好,并导致一个大的存储库repo.git.
对于14 git repo中的每一个,我克隆主repo并运行以下命令:
git filter-branch -d /tmp/rep --tag-name-filter cat --prune-empty --subdirectory-filter "sub/directory" -- --all
Run Code Online (Sandbox Code Playgroud)
但是,在此命令之前,我必须git filter-branch为某些git存储库执行另一个命令,因为我必须重写提交以将文件从目录移动到另一个目录.这--tree-filter是我使用的选项.以下是执行命令行的示例:
script_tree_filter="if test -f rep/to/my/file && test -d another/rep ; then echo Moving my file ; mv rep/to/my/file another/rep; fi"
git filter-branch -d /tmp/rep --tag-name-filter cat --prune-empty --tree-filter '$script_tree_filter' -- --all
Run Code Online (Sandbox Code Playgroud)
在过程结束时(14500提交:大约需要1小时!)我清理refs并使用git gc:
git for-each-ref --format="%(refname)" refs/original/ | xargs -n 1 git update-ref -d
git reflog expire --expire=now --all
git gc --prune=now
Run Code Online (Sandbox Code Playgroud)
最后,我获得了一个大小为1.2Go的存储库(显然仍然是太大了),通过查看提交,我可以看到很多旧的仍然存在.它们涉及在--subdirectory-filter命令之后不再存在的文件和目录. …