我正在从cvs迁移到git。 (如果你愿意,可以嗤之以鼻,但前提是你的公司已经存在了15年。)
我有一些旧的CVS标签,只标记回购中的一些文件,并非全部。当我检查这些标签时,它看起来像一个已删除所有未标记的回购。这是cvs / svn和git之间分支模型的众所周知的差异。
我想建立一个像这样的新分支:
tags/A
。tags/B
。理想情况下,新分支将包含已标记文件的旧历史以及主分支。
有没有好办法呢?
答案 0 :(得分:1)
您是否能够在事后(现在在CVS中)为cvs2git脚本准备cvs repo?逐步浏览所有标记并将缺少的文件添加到标记中。 cvs tag
本身-F
不会移动标记master
。因此,您可以根据标记/ B重新应用标记/ A,它只会将其应用于尚未标记的文件,这正是您想要的。
可能会发现您只是拥有太多标签才能实现这一目标。我想2万个标签x 5分钟/标签= 34天。
但我不知道在git中执行它会不会更快。一旦你使用git,你就必须清理所有cvs2git工件:与每个标签相关的fixup提交等。但是我可以想象,理论上,逐步执行每个标记,检出更多文件,添加它们,修改提交(通过适当的GIT_环境变量保留作者和日期),移动标记,将其与之前的提交进行比较实际上在分支上,以防你只需将标签移回一个。
此外,您的标签是否位于他们应该使用的指定分支上,这对您来说很重要吗?因为所有那些fixup提交他们都不会,即使你的修正。确保您的UNWIND
分支以最优雅和最有意义的方式转换,同时让一些较旧的分支变得有点硬,这可能是务实的。
<强>更新强>
只是一个疯狂的想法。做cvs2svn,修复标签,然后svn2git是否有意义?我知道这听起来有点疯狂,但是subversion有git的变更集,但能够像cvs一样逐个文件地工作,所以它可能是修复标签的最佳位置。
答案 1 :(得分:1)
git checkout -b release master
git merge --no-commit -s ours tags/A tags/B
git checkout tags/A -- .
git checkout tags/B -- .
git commit # put the above sequence in the commit message if you have love in your heart
第一个命令是“结帐当前主人,但作为名为release的新分支:”。
第二个是“设置但不提交标签/ A和标签/ B的无操作合并”。在提交之前,您可以安排所需的任何合并结果。
...特别是,第三个和第四个命令加载了这两个提交中的内容的版本。