向树中的文件头添加许可证,追溯

时间:2012-01-14 23:55:25

标签: git svn version-control

有一个闭源项目将是开源的,我被要求尝试追溯性地向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现在的位置,那就太好了。

2 个答案:

答案 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