问题
我只是意外地将更改提交到仅用于帮助调试问题的文件。结果,我更加搞乱了我们软件的当前版本,因为我意外地禁用了重要的功能: - (。
由于这不是第一次发生(而且我不是唯一一次发生),我的问题是:
是否有一种实用的机制来防止意外提交您不想提交的更改?
我正在考虑你已经知道你不想在制作它们时提交它们的变化(例如修改以帮助调试或测试)。
我目前的做法:
通常我只用// FIXME: DEBUG
标记这些更改,因此它们会在Eclipse中列出并突出显示。但这还不够,因为我仍然可以提交这些文件。
我想要一些机制告诉Subversion“不要在这种状态下提交此文件” - 可能是一个特殊的注释或一些文件属性(比如“将此文件锁定为提交”)。有没有这样的机制?
我能想到的唯一解决方案是使用预提交钩子来扫描特殊注释,但是如果我可以帮助它,我想避免配置服务器端的东西。
答案 0 :(得分:4)
你可以在subversion中添加一个预提交钩子来检查特定的subversion属性,例如: mycompany:dontcommit
。
然后,您可以在本地文件上设置此属性,如果您尝试提交该文件,则subversion服务器将拒绝该文件。
我们一直在使用这个系统,相信我,它已经节省了我几次。 ;)
答案 1 :(得分:2)
这个答案特定于Visual Studio,但我强烈怀疑可以为Eclipse做类似的事情。
在使用C#的Visual Studio中,我在调试模式下编译时进行所有开发和大多数测试。调试模式使用定义的DEBUG标志进行编译。然后,每当我编写会破坏某些内容的测试代码时,我就将其放在旁边:
#if !DEBUG
#error DEBUG is not defined. Fix the above lines, which are for debugging only.
#endif
然后我确保在我发布到生产环境之前,我从在Debug模式下编译切换到在Release模式下编译。发布模式未定义DEBUG符号,因此编译器会生成错误。
如果您不习惯始终在发布模式下发布,那么这当然不会起作用。如果你不记得复制和放弃它也将无法工作。每当你破坏某些东西时粘贴该代码。但实际上,任何解决方案都会遇到类似的问题。
请注意,使用我的解决方案,我仍然忘记并将损坏的代码提交到SVN存储库。但是,只要每个人都遵循发布过程,只要有人去构建版本,他们就会遇到编译错误并发现问题。
答案 2 :(得分:1)
1)调试基础设施。如果你总是在那里有语句但是关闭了,那么你检查它们并不重要。事实上,你想要检查它们。在调试时,打开调试。您还可以使临时解决方法依赖于调试标志。例如。当你想跳过一段代码时:
if {$debugflag < 50} {
doImportantFeature
} else {
doMyDummyTestThing
}
2)使您的构建过程更加健壮。许多公司每晚都会进行自动构建甚至自动安装,但这对我来说似乎不对。频率不是自动 - 。
3)使用分布式版本控制系统。这样,如果您想要/忘记,您可以在本地提交调试内容,但是当您将其提交到主存储库时,您将再次查看这些内容。
答案 3 :(得分:1)
一个本地解决方案是使用更改集管理您的文件。
这适用于我们的组织。
每个开发者都有一个&#34; local-do-not-commit&#34;更改设置我们调试更改的位置。
我们还有一个真实的&#34;改变我们打算提交的集合。
它确实需要你移动&#34;未分配&#34;更改为正确的更改集。
我们正在使用Eclipse / Subversive。这允许您从Eclipse中提交特定的更改集。
如果您使用的是SVN命令行,则有&#34;更改列表&#34;这样做的选项。
注意:颠覆性的&#34;更改集&#34;与SVN&#34;变更列表&#34;不同。 (不知道为什么会这样。但是,这很烦人。)
答案 4 :(得分:1)
Soemtimes,你能做的最好的事情就是编写一个单元测试,以你想要的方式设置环境,并允许你测试这个场景,然后当你提交它时,它将自动开始经常测试。
我也喜欢使用像if(debug)这样的标志的其他想法,只有在需要时才可以在运行时打开它。
但是要回答你的问题,这里有一个适用于此的预提交脚本。 IT查看您提交的所有文件,如果文件包含文本“DoNotCommit”,那么它将给您一个错误。每当我做一个仅用于测试的更改时,我打算发表这样的评论。好的是,您可以将此注释放在任何类型的文件中,它将始终捕获它。
#!/bin/bash
function die {
>&2 echo $1
exit 6
}
REPOS="$1"
TXN="$2"
SVNLOOK=/usr/bin/svnlook
# Make sure that the log message contains some text.
#$SVNLOOK log -t "$TXN" "$REPOS" | \
# grep -q "[a-zA-Z0-9]" || die "Blank message not allowed"
# make sure the files do not contain DoNotCommit
# this runs svnlook changed which shows a list of adds, updates and deletes, for each file it calls svnlook cat to look at the contents
for file in `$SVNLOOK changed -t "$TXN" "$REPOS" | awk '{print $2}'`; do
# skip over file that ends in / because it is a directory
if [[ "$file" != */ ]]; then
$SVNLOOK cat -t "$TXN" "$REPOS" "$file" | grep -q -i "DoNotCommit" && die "Found text DoNotCommit in $file";
fi
done
# Exit on all errors.
set -e
# uncomment this to make it always fail at the end while testing changes to script
#>&2 echo failing at end
#exit 3
# All checks passed, so allow the commit.
exit 0
答案 5 :(得分:0)
当您碰巧在工作区中进行大量临时代码更改时,我的解决方案很方便,但是当您离开时,并不打算在一天结束时提交所有内容。这就是我每天都做的事。
我在项目中创建了一个名为@Tempcheckout的自定义注释。这个我注释那些我仅为临时目的而改变的类。在一天结束后提交(可能是20-30个文件的任何地方),我有一个由提交触发的Jenkins作业,它会扫描代码库中的所有类以获取注释,并在发生的情况下邮寄给我犯下任何意外的事情。 (或使用google-Reflections的任何包模式)。