有一个封闭源代码的项目即将开源,我被要求尝试向 SVN 存储库中的所有源文件追溯添加许可证,因为树历史可能是普遍感兴趣的。也有兴趣迁移到 DVCS,并且 hgsubversion 似乎没有跟踪 svn mergeinfo,所以我决定尝试将 SVN 存储库转换为 git(进行固定标签等的单向转换),然后尝试编辑那里的历史。
我真的很幸运,因为第一次修订恰好有一个分支导致为早期的公共(public)源代码版本完成工作。因此,我决定尝试 git rebase sourcerelease-branch master
。几个非常痛苦的小时后,我完成了...
...除了一个问题。转换后的存储库中有几个分支(包括一个实际上是 2009 年左右主线开发的“分支”),看起来 rebase 并没有遍历它们。在 #git
中询问,我被告知不可能使 git rebase
遍历分支。
好吧……我该怎么办?使用 git 或其他一些版本控制系统,我想要实现的目标是否可行?
编辑:这是我所拥有的视觉效果
A---B random_branch
/
C---D---E---F master
\
G---H add_license_branch
我基本上想让我在 change-license-branch
中所做的更改出现在 master
和从 master
分支的任何分支中> 例如 random_branch
。当我完成时,我什至不需要 add_license_branch
,如果我可以将 C、G 和 H 压缩在一起并将结果放在 C 现在所在的位置,那就太好了。
最佳答案
我刚刚做了类似的事情,但更简单一些,因为我只想保留一个分支。我想在每个 (java) 代码文件的顶部插入版权声明。
我用了filter-branch使用 --tree-filter
,它将检查每个提交并针对它运行 shell 命令,然后重新提交。子提交不会 rebase ,因此必须针对每个提交运行它,否则看起来就像是添加了通知,然后又将其删除。
以下查找所有 Java 代码文件,并对每个文件运行 sed 以在文件开头的 /path/to/header.txt
处插入文件内容。
$ git filter-branch --tree-filter "find ./ -name '*.java' -exec sed -i '1 {
h
r /path/to/header.txt
g
N
}' {} \;" HEAD
更改'*.java'
以匹配您要修改的文件,将/path/to/header.txt
更改为您想要的 header 的绝对路径插入,它应该适用于简单的情况。
注意:以上假定 header 尚未出现在任何代码文件中,如果它们已经存在,则将它们加倍。为避免这种情况,可以通过检查 header 的第一部分来更新 sed 参数。对 sed 更有经验的人可能知道如何执行此操作。
关于git - 追溯地向树中的文件头添加许可证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8866416/