Svn 避免在Subversion中意外提交对文件的某些更改

Svn 避免在Subversion中意外提交对文件的某些更改,svn,Svn,问题 我只是无意中对一个文件做了一个更改,这个更改只是为了帮助调试一个问题。结果,我把我们软件的当前版本搞砸了,因为我不小心禁用了重要的功能:-( 由于这不是第一次发生(我也不是唯一一个发生这种事的人),我的问题是: 是否有一种实用的机制来防止意外提交您不希望提交的更改? 我想到的更改是您已经知道在进行更改时不想提交的更改(例如帮助调试或测试的修改) 我当前的方法: 通常我只是用一个//FIXME:DEBUG标记这样的更改,以便在Eclipse中列出并突出显示它们。但是这还不够,因为我仍然可以提

问题

我只是无意中对一个文件做了一个更改,这个更改只是为了帮助调试一个问题。结果,我把我们软件的当前版本搞砸了,因为我不小心禁用了重要的功能:-(

由于这不是第一次发生(我也不是唯一一个发生这种事的人),我的问题是:

是否有一种实用的机制来防止意外提交您不希望提交的更改?

我想到的更改是您已经知道在进行更改时不想提交的更改(例如帮助调试或测试的修改)

我当前的方法:

通常我只是用一个
//FIXME:DEBUG
标记这样的更改,以便在Eclipse中列出并突出显示它们。但是这还不够,因为我仍然可以提交这些文件

我想要一些告诉Subversion“不要在这种状态下提交这个文件”的机制——可能是一个特殊的注释或一些文件属性(比如“为提交而锁定这个文件”)。有这样的机制吗


我能想到的唯一解决方案是有一个预提交钩子来扫描特殊注释,但如果我能帮助的话,我想避免在服务器端配置stuff。

您可以为subversion添加一个预提交钩子,用于检查特定的subversion属性,例如
mycompany:dontcommit

然后,您可以在本地文件上设置此属性,如果您尝试提交该文件,subversion服务器将拒绝该文件

我们使用这个系统已经有一段时间了,相信我,它为我节省了几次时间。

1)调试基础设施。如果你一直都有语句,但都关闭了,那么你是否签入它们也没关系。事实上,你想让他们入住。调试时,启用“调试”。您还可以使临时解决方案依赖于调试标志。例如,当您想跳过一段代码时:

if {$debugflag < 50} {
    doImportantFeature
} else {
    doMyDummyTestThing
}
如果{$debugflag<50}{
重要特征
}否则{
多米杜姆泰斯特酒店
}
2) 使构建过程更加健壮。很多公司每天晚上都会进行自动构建,甚至自动安装,但我觉得这是不对的。与其说是频率,不如说是自动


3) 使用分布式版本控制系统。这样,如果您愿意/忘记,您可以在本地提交调试内容,但当您将其提交到主存储库时,您将再次检查这些内容。

这个答案是特定于Visual Studio的,但我强烈怀疑Eclipse也可以做类似的事情

在使用C#的Visual Studio中,我在调试模式下编译时进行所有开发和大多数测试。调试模式使用定义的调试标志进行编译。然后,每当我编写会破坏某些东西的测试代码时,我都会将其放在它旁边:

#if !DEBUG
#error DEBUG is not defined. Fix the above lines, which are for debugging only.
#endif
然后,我确保在发布到生产环境之前,从调试模式编译切换到发布模式编译。发布模式没有定义调试符号,因此编译器会生成错误

当然,如果你没有习惯于总是以发布模式发布,这是行不通的。如果你不记得在你破坏某些东西的时候复制并粘贴代码,它也不会起作用。但实际上,任何解决方案都会遇到这样的问题


注意,对于我的解决方案,我仍然会忘记并将损坏的代码提交到SVN存储库。但是,只要每个人都遵循发布过程,一旦有人开始构建发布,他们就会出现编译错误并发现问题。

一个本地解决方案是使用更改集管理文件

这是为我们的组织工作

每个开发人员都有一个“本地不提交”更改集,我们在其中放置调试更改

我们也有一个“真正的”变更集,我们打算提交

它确实需要您将“未分配”更改移动到正确的更改集中

我们正在使用Eclipse/Subversive。这允许您从Eclipse中提交特定的更改集

如果您使用的是SVN命令行,则有“changelist”选项可以执行此操作


注:颠覆性“变更集”与SVN“变更列表”不同。(不知道为什么会这样。但是,这很烦人。)

当您碰巧在工作区中进行了大量临时代码更改,但不打算在一天结束时提交所有内容时,我的解决方案非常方便。这是我每天做的事


我在项目中创建了一个名为@Tempcheckout的自定义注释。这是我对那些仅为临时目的而更改的类的注释。在一天结束时提交(可以是20-30个文件)之后,我有一个由提交触发的Jenkins作业,它扫描代码库中的所有类以获取注释,并向我发送邮件,以防我无意中提交任何内容。(或使用google Reflections的任何包模式)

soemtime,您可以做的最好的事情是编写一个单元测试,以您想要的方式设置环境,并允许您测试此场景,然后在您提交时,它将开始自动且经常地测试此场景

我还喜欢使用if(debug)这样的标志,只有在需要时才可以在运行时打开它

但为了回答您的问题,这里有一个预提交脚本,可以用于此。它会检查您正在提交的所有文件,如果该文件包含文本“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

听起来很像git。可能是@Wim Coenen的重复:是的,这个问题很相似。然而,它有点窄,因为is专门询问如何使用变更列表解决问题,而我对任何独立于o的解决方案都感兴趣