Svn Subversion:防止提交对一个文件的本地修改?
我有一个Subversion工作副本,其中我对一个文件进行了一些本地修改。这些修改只与我有关,我不想提交它们。(存储库中的版本包含一些适用于其他用户的默认值,但不适用于我,这就是我希望在本地覆盖它们的原因。) 请注意,尽管我不想提交更改,但我确实希望在执行Svn Subversion:防止提交对一个文件的本地修改?,svn,Svn,我有一个Subversion工作副本,其中我对一个文件进行了一些本地修改。这些修改只与我有关,我不想提交它们。(存储库中的版本包含一些适用于其他用户的默认值,但不适用于我,这就是我希望在本地覆盖它们的原因。) 请注意,尽管我不想提交更改,但我确实希望在执行svn update时接收存储库中的任何更新。此外,只有在我的工作副本中,我才不想将更改提交到该文件,其他用户不应受到影响。因此svn:ignore或commit钩子不符合我的目的 目前,我只是做: svn commit file1 file2
svn update
时接收存储库中的任何更新。此外,只有在我的工作副本中,我才不想将更改提交到该文件,其他用户不应受到影响。因此svn:ignore
或commit钩子不符合我的目的
目前,我只是做:
svn commit file1 file2...
其中,我显式指定了发生更改的文件,不包括我不想提交的特定文件
然而,当我工作时,我有一个习惯,就是简单地写:
svn commit -m "Log of what I just did"
我担心在我不专心的时候,使用上述命令会无意中提交“禁止”文件
简言之,我所寻找的只是一种在工作副本中“标记”文件的方法,它可以防止Subversion提交该文件中的更改(不必自动排除,即使在尝试提交所有文件时出现错误,也可以)。有点像在“冲突”状态下标记文件
这样的事情存在吗
更新:akent,谢谢你指出这一点。锁肯定不是你想要的,我认为任何内置功能都不能帮你 根据您工作的环境,我将编写一个脚本:
svn status | grep ^M | grep -v exclude.c | awk -F' ' '{print $2}' | xargs svn ci -m "I'm committing something"
或者,如果文件列表确实是静态的,只需修复该列表 我理解你的问题;此“禁止”文件可能包含仅与本地生成环境相关的配置设置等。我还没有找到直接告诉SVN忽略版本文件中的更改的方法,但这里有一个我过去使用过的解决方法 假设您的文件被调用,比如说,“build.conf”。将SVN版本文件命名为build.conf.example。然后,在Makefile或build脚本中,您可以自动将build.conf.example复制到真实的build.conf,该文件保持不变。然后您可以忽略build.conf,然后每个开发人员都可以对其进行任何本地更改 但是“一定有更好的办法” 编辑:此处的问题几乎相同:此问题位于。但是,如果您不控制存储库,那么答案就没有多大帮助
:: Stops commits that contain the NOCOMMIT keyword.
setlocal
set REPOS=%1
set TXN=%2
SVNLook diff %REPOS% -t %TXN% | findstr /I /M /L NOCOMMIT > nul
if %errorlevel% gtr 0 (
exit 0
) else (
echo Your commit has been blocked because it contains the keyword NOCOMMIT. 1>&2
exit 1
)
也许可以尝试在subversion之上管理您的本地副本。有一个简单的解决方案。然后,您可以使用来跟踪svn存储库中的更改并提交更改。它将需要一些学习和培训。创建一个包含该文件的文件,然后不必关注变更列表。文件将在那里等待提交,但是您的常规提交(在默认变更列表上工作)将永远不会接收它
svn changelist mylocal file1
将创建名为
mylocal
的变更列表,并将文件file1
分配给它。您可以使用预提交挂钩。
在钩子中,使用
svnlook author
查看您是否是提交更改的人。如果是这样,请使用svnlook changed
查看您是否正在更改一个禁止的文件。根据我的经验:不要将该文件置于版本控制之下,并对其使用svn:ignore
一开始有点难,因为你不能忽略一个在版本控制下已经准备好的文件,你也不能从版本控制中删除一个文件而不将其从硬盘中删除(以及在下一次更新时从每个工作副本中删除…)。但是,当你最终成功地建立了正确的回购协议,它的工作就像魅力。不要忘记添加一个通用模板来代替原始配置文件(这样每个人都知道新的配置变量,等等)
新回购协议:
mkdir config
svn add config
svn propset svn:ignore '*.conf' config
对于现有的repo:请确保,要在每个工作副本中备份您的配置,然后从repo中删除(svn del)config,提交(请注意:下次更新时,该文件将在每个工作副本中删除!您必须有一个备份),然后还原该文件并设置ignore属性
另一种方法是锁。它保证没有人提交文件,但每次提交时都会导致错误。不太好
第三种方法是变更集,这是SVN1.5客户端中的一个新特性。这很简洁,但它只与一个工作副本相关,而与全局存储库无关。您必须手动设置它们,添加每个新文件-这很难维护。说到Tortoisesvn和变更列表,它已经附带了一个名为提交时忽略的变更列表,它可以满足您的需要。如果您在Windows上,请使用Tortoisesvn。您可以向中添加与您描述的行为完全相同的文件。实际上,预提交脚本可以完成这项工作 编写一个预提交脚本,该脚本执行“svnlook diff”,并在更改集中设置了名为“nocommit”的属性时拒绝提交
然后,在工作副本中,您可以在任何不应提交的文件上设置“nocommit”属性。如果任何文件具有“nocommit”属性,则任何后续提交都将失败。如果以后确实需要签入对文件的更改,则只需从工作副本中删除“nocommit”属性即可。有一些答案可以解决:
#!/bin/sh
REPOS="$1"
TXN="$2"
SVNLOOK=/usr/local/bin/svnlook
$SVNLOOK diff -t "$TXN" "$REPOS" | grep -i "NOCOMMIT" > /dev/null && { echo "Your commit has been blocked because it contains the keyword NOCOMMIT." 1>&2; exit 1; }
svn cp ^/trunk ^/branches/your_name -m "Creating a personal branch."
cd working_copy_of_trunk/sub_path/
svn switch ^/branches/your_name/sub_path/your_file your_file
$ svn status
M file01
M ...
M file100
M file_not_ready_for_commit
// This will add all working copy files, can be adjusted to add only relevant files
$ svn changelist mychangelist -R .
// Remove the nascent one(s)
$ svn changelist mychangelist --remove file_not_ready_for_commit
// Commit only the files in the changelist
$ svn commit --changelist mychangelist