我正在使用 git 对我的配置文件进行版本控制。现在我需要将一些配置文件移至不同的存储库,以实现干净的结构。如果我将文件移至不同的存储库,是否有办法保留文件的更改日志?
如果我将 A 移至 B/a,我希望 B 中涉及文件 A/a 的 A 仓库的所有提交都包含在 B 仓库中。理想情况下,如果我随后将 A/x 移至 B/x,我希望看到 B/a 和 B/x 一起出现在涉及仓库 A 中两个文件的提交中。我不希望 A/a 的任何开发步骤合并到 B 的任何提交中,我只是希望它们随后出现在那里。
谢谢您最好的问候
答案1
假设您想要将历史记录filename.conf
从一个源存储库转移到另一个接收存储库。我认为您要遵循的策略是:
- 在源存储库中,创建一个提交分支,该分支被重写为仅包含
filename.conf
。 - 将独立的提交行合并到接收存储库中的正常分支中。
在执行此操作之前,请务必备份您的存储库!
在源存储库中,使用过滤分支重建历史记录,删除除 之外的所有内容filename.conf
。
git checkout -b filtered-commits
git filter-branch -f --prune-empty --tree-filter 'find . -not -name filename.conf -exec rm {} \;' filtered-commits
然后,在接收存储库中:
git pull path/to/source/repo
如果您还需要移动存储库内的路径filename.conf
,则可能需要使用--subdirectory-filter
选项git filter-branch
。
答案2
前几天我在考虑 Mercurial 的类似问题。我想我会写一个脚本(可能是 Python,但实际上任何可以运行 shell 命令的东西)来:
- 对于涉及文件 X 的每个修订版本(称之为“#rev”)
- 将文件 X 从 #rev 复制到其新位置
- 使用来自 #rev 的消息在新 repo 中提交
如果脚本可以允许注释编辑和“忘记”某些版本(如果需要),那就太好了。
答案3
由于git filter-branch
对于大型存储库来说速度可能会慢得令人无法忍受,这个技巧使用git log
、git format-patch
和git am
可以成为一种有用的替代方法。