git - 追溯地向树中的文件头添加许可证

标签 git svn version-control

有一个封闭源代码的项目即将开源,我被要求尝试向 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/

相关文章:

git - 克隆后直接将文件列为已修改

java - Eclipse 不断构建工作区

svn - 颠覆: more files than expected when merging a branch to trunk

.net - 删除 Team Foundation Server 2010 中的分支映射

version-control - Perforce 文件夹的服务器端复制/移动 - 无需本地同步文件

svn - 更改 SVN 修订的时间戳

git - 如何将 Docker 构建的上下文定义为本地分支之一上的特定提交?

git - 在已推送的 Git 中编辑不正确的提交消息

git - 将两个 git 存储库 merge 为不同的版本

svn - 如何获取svn远程仓库URL?