有一个闭源项目将是开源的,我被要求尝试追溯性地向SVN存储库中的所有源文件添加许可证,因为树历史可能是普遍感兴趣的。还有兴趣迁移到DVCS,而hgsubversion似乎没有跟踪svn mergeinfo,所以我决定尝试将SVN存储库转换为git(进行修复标签等的单向转换),然后尝试编辑那里的历史。
我实际上非常幸运,因为第一次修订发生了一个分支,导致为早期的公共源版本完成工作。因此,我决定尝试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现在的位置,那就太好了。
答案 0 :(得分:3)
我刚做过类似的事情,但有点简单,因为我只想保留一个分支。我想在每个(java)代码文件的顶部插入版权声明。
我使用filter-branch和--tree-filter
,它将检出每个提交并对其运行shell命令,然后重新提交。子提交没有重新设置,因此必须针对每次提交运行,否则它会看起来像添加了通知,然后被删除。
以下查找所有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
更改为您要插入的标题的绝对路径,它应该适用于简单的情况。
注意:上面假设标题尚未出现在任何代码文件中,并且如果它们已经存在则将它们加倍。为避免这种情况,可以通过检查标头的第一部分来更新sed参数。对sed更有经验的人可能知道如何做到这一点。
答案 1 :(得分:0)
没有看到您的历史记录的确切结构,请调查以下概念:
git filter-branch
git rebase --preserve-merges
git rebase --onto
grafting
git-svn # for further work with the 2 repos