假设我们有Repo-A和Repo-B。我在Repo-A中有一个文件夹结构,如下所示:
Repo-A /Folder-1
/Folder-2
/Folder-3我想将Folder-1和Folder-2迁移到Repo-B。我知道我可以使用这里给出的方法迁移单个目录- How to move files from one git repo to another (not a clone), preserving history,所以我使用Folder-1这样做,但是当我再次做同样的事情来迁移第二个文件夹时,我得到了重复的提交,一些提交在过去同时影响了Folder-1和Folder-2。我该如何解决这个问题呢?
我还尝试将所有想要迁移的文件放在一个特定的文件夹中,但在迁移该文件夹时,我丢失了提交历史记录。
发布于 2020-02-21 19:45:18
这听起来像是您想要一个包含两个文件夹中所有文件更改的历史记录。你不能用--directory-filter做到这一点,但是你仍然可以在--index-filter中使用filter-branch。
git filter-branch --index-filter 'git rm --cached -r --ignore-unmatch -- :/:* :/!:Folder-1 :/!:Folder-2` --prune-empty -- --all使用git rm作为index-filter通过将原始提交加载到索引、删除一些文件并提交新索引,从每个原始提交创建新的提交。
每个:/!:...选项都告诉git rm不要删除指定的文件夹及其内容,而:/:*则告诉它删除其他所有内容。
--prune-empty选项从新的历史记录中删除任何只更改了您保留的文件夹之外的文件的提交-因为这些文件看起来在新的历史记录中没有做任何事情。如果您希望保留这些提交,则可以忽略此选项。
上面的命令将文件保存在其原始目录中。如果您想要一些不同的东西,那么您可能需要使用--tree-filter而不是--index-filter。该选项相当慢(特别是当repo很大时),但更容易进行更复杂的更改(因为筛选器脚本只需对磁盘上的文件进行操作,而不是直接转换索引)。
也就是说,在最近的某个时候,文档建议不要使用filter-branch。我还不熟悉他们建议使用的工具。
因此,这里是filter-branch文档,您可以根据警告查找不同的工具,或者了解有关上述过程的更多信息:https://git-scm.com/docs/git-filter-branch
https://stackoverflow.com/questions/60336441
复制相似问题