我在一家公司内部使用SCCS开发它的主要应用程序。我们目前有两个开发流,称为Stable和Experimental。 Stable目前正在进行更改,主要是错误修复,也可能解决实验中的问题。实验是增加一个相当大的新功能。
我遇到的主要问题是开发Stable的开发人员也没有将他们的更改放在实验中。当我正在研究实验时,我必须合并两个分支。
我自己一直在使用Git大约一年,并且它在一个分支(稳定版)上运行得很好,我可以这样做:
git checkout master
<copy all Stable files over, which will add changes>
git commit -a -m "Updated files 06/19/2011"
git checkout New_Feature
git rebase master
这会使用Stable中的更改更新我的所有文件。但是,现在他们正在使用两个开发分支,我遇到了很多合并冲突。这源于SCCS将元数据放在源文件的顶部,如下所示:
#pragma ident "@(#)file1.c 1.233 06/17/11 Company_Experimental"
请注意版本号(1.233),日期和公司/分支关键字。每次签到都会更改日期和版本号,并且分支会在稳定版和实验版之间更改。我不关心顶部是什么,因为当我检查文件时,它将丢弃顶部并根据我检查它的时间和地点获得新值。
尽管如此,这条线始终位于顶部。有没有办法忽略顶线,或者以某种方式使这个工作流更易于管理,这样我就可以将开发流与我自己的工作合并而不会经历很多无意义的合并冲突?
注意:我已经竞选改变版本控制系统,但我们有很多不会改变方式的老程序员。请不要回答,“您的公司应该切换到X”。相信我,我和你在一起100%。
答案 0 :(得分:2)
如果您只是删除git仓库中的pragma ident行的内容(您可能会这样做,因为SCCS会为您添加它们),您只需添加:
* filter=skip-ident
到.git / info / attributes(或$ GIT_DIR / info / attributes)或.gitattributes(如果你想用git跟踪属性文件本身)并输入如下内容:
[filter "skip-ident"] clean = "sed '/\(#pragma ident\).*/s//\1/'"<。>在.git / config中。每当任何文件(与.git / info / attributes的第一列中的模式匹配的文件,在这种情况下为'*')被添加到git时,内容将通过clean脚本运行,在这种情况下只删除所有身份信息。
答案 1 :(得分:1)
您可以使用自定义涂抹清洁脚本。更多信息可以在the attributes chapter in the ProGit book中找到。您也可以编写合并驱动程序。
完成合并后,每个文件的第一行必须说什么?我什么都不做,你依靠SCCS为你做这件事。这应该使涂抹清洁脚本变得容易。
答案 2 :(得分:0)
该行
#pragma ident "@(#)file1.c 1.233 06/17/11 Company_Experimental"
存储在SCCS中,其关键字如下:
#pragma ident "%A%%M% %I% %D% Company_Experimental"
(原谅如果我得到一些令牌错误,我在一年前就停止使用旧的主力车了。)
使用git进行提交时,将固定的#pragma行替换为sccs期望的标记。