git:移动到其他存储库时保留文件的变更日志

git:移动到其他存储库时保留文件的变更日志

我正在使用 git 对我的配置文件进行版本控制。现在我需要将一些配置文件移至不同的存储库,以实现干净的结构。如果我将文件移至不同的存储库,是否有办法保留文件的更改日志?

如果我将 A 移至 B/a,我希望 B 中涉及文件 A/a 的 A 仓库的所有提交都包含在 B 仓库中。理想情况下,如果我随后将 A/x 移至 B/x,我希望看到 B/a 和 B/x 一起出现在涉及仓库 A 中两个文件的提交中。我不希望 A/a 的任何开发步骤合并到 B 的任何提交中,我只是希望它们随后出现在那里。

谢谢您最好的问候

答案1

假设您想要将历史记录filename.conf从一个源存储库转移到另一个接收存储库。我认为您要遵循的策略是:

  1. 在源存储库中,创建一个提交分支,该分支被重写为仅包含filename.conf
  2. 将独立的提交行合并到接收存储库中的正常分支中。

在执行此操作之前,请务必备份您的存储库!

在源存储库中,使用过滤分支重建历史记录,删除除 之外的所有内容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 命令的东西)来:

  1. 对于涉及文件 X 的每个修订版本(称之为“#rev”)
    1. 将文件 X 从 #rev 复制到其新位置
    2. 使用来自 #rev 的消息在新 repo 中提交

如果脚本可以允许注释编辑和“忘记”某些版本(如果需要),那就太好了。

答案3

由于git filter-branch对于大型存储库来说速度可能会慢得令人无法忍受,这个技巧使用git loggit format-patchgit am可以成为一种有用的替代方法。

答案4

也许工具不对……git 用于处理以某种协调方式更改的文件集合,而配置文件通常处于孤立状态。请查看一次一个文件的 VCS,例如雷达反射截面(是的,它仍然存在,甚至可能在你的 Linux 发行版中有一个官方软件包)或新的、非常轻量级的(并且被积极照顾)新加坡铁路公司。最后一个是为了(在某种程度上)与 git 一起工作,它使用相同的快速导入/快速导出格式,并(重新)使用一些 git 的全局或用户配置。

相关内容