SVN:有没有办法将文件标记为“不提交”?
使用TortoiseSVN,我可以将一个文件移动到ignore-on-commit更改列表中,这样当我提交整个树时,对该文件的更改不会被提交。
有没有办法做这样的事情使用svn命令行工具?
编辑:感谢您的build议,使用svn:ignore
,但是这并不完全是我所期待的。
svn:ignore
影响像svn add
& svn import
类的东西。 它给它一个文件名模式列表忽略。
我有一个已经在源代码pipe理下的文件,但是我想对那个文件做一些临时的修改,以后我不想在提交整个源代码树的时候再提交。 我做了很多其他更改,我可以在我的监视器上粘贴一个注释,告诉我在提交树之前还原该文件,但如果svn可以自动跳过该文件,那将会很好。
截至2016年2月/版本1.9,Subversion没有内置的“不提交”/“忽略提交”function。 这个答案是一个非理想的命令行解决方法
如OP所述,TortoiseSVN有一个内置的变更列表“ignore-on-commit”,它会自动从提交中排除。 命令行客户端没有这个,所以你需要使用多个更改列表来完成相同的行为(注意事项) :
- 一个你想要做的工作[工作]
- 一个你想忽略的事情[ignore-on-commit]
由于TortoiseSVN有先例,我在我的例子中使用了“ignore-on-commit”来表示我不想提交的文件。 我将使用“工作”作为我所做的文件,但是你可以select你想要的任何名字。
首先,将所有文件添加到名为“work”的更改列表中。 这必须从工作副本的根目录运行:
svn cl work . -R
这将recursion地将工作副本中的所有文件添加到名为“work”的更改列表中。 这是一个缺点 – 随着新的文件被添加到工作副本,你需要专门添加新的文件,否则将不被包括在内。 其次,如果你不得不再次运行,那么你需要重新添加所有的“ignore-on-commit”文件。 不理想 – 您可以像其他人一样,在文件中保留自己的“忽略”列表。
然后,对于要排除的文件:
svn cl ignore-on-commit path\to\file-to-ignore
由于文件只能位于一个更改列表中,所以在之前的“工作”添加之后运行这个添加将从“工作”更改列表中删除要忽略的文件,并将其置于“ignore-on-commit”更改列表中。
当你准备提交你想修改的文件时,你只需要在你的提交中添加“–cl”
svn commit --cl work -m "message"
以下是我的机器上的一个简单示例:
D:\workspace\trunk>svn cl work . -R Skipped '.' Skipped 'src' Skipped 'src\conf' A [work] src\conf\db.properties Skipped 'src\java' Skipped 'src\java\com' Skipped 'src\java\com\corp' Skipped 'src\java\com\corp\sample' A [work] src\java\com\corp\sample\Main.java Skipped 'src\java\com\corp\sample\controller' A [work] src\java\com\corp\sample\controller\Controller.java Skipped 'src\java\com\corp\sample\model' A [work] src\java\com\corp\sample\model\Model.java Skipped 'src\java\com\corp\sample\view' A [work] src\java\com\corp\sample\view\View.java Skipped 'src\resource' A [work] src\resource\icon.ico Skipped 'src\test' D:\workspace\trunk>svn cl ignore-on-commit src\conf\db.properties D [work] src\conf\db.properties A [ignore-on-commit] src\conf\db.properties D:\workspace\trunk>svn status --- Changelist 'work': src\java\com\corp\sample\Main.java src\java\com\corp\sample\controller\Controller.java src\java\com\corp\sample\model\Model.java M src\java\com\corp\sample\view\View.java src\resource\icon.ico --- Changelist 'ignore-on-commit': M src\conf\db.properties D:\workspace\trunk>svn commit --cl work -m "fixed refresh issue" Sending src\java\com\corp\sample\view\View.java Transmitting file data .done Committing transaction... Committed revision 9.
另一种方法是简单地将每一个你想要提交的文件添加到“工作”更改列表中,甚至不保留忽略列表,但是这也是一个很大的工作。 真的,唯一简单的,理想的解决scheme是,如果/这在SVN本身实现。 在Subversion问题跟踪器SVN-2858中,如果将来发生变化,这个问题还存在一个长期的问题。
我也一直在这种情况下发现自己:改变列表不适用于我 – 我想列出一些我不想提交的文件,而不是保留一大堆我想要的文件承诺!
我在linux命令行上工作:所以我的解决scheme是创build一个脚本/ usr / bin / svnn(是的,有两个'n's!),如下所示:
#! /bin/bash DIR=/home/mike/dev/trunk IGNORE_FILES="\ foo/pom.xml \ foo/src/gwt/App.gwt.xml \ foo/src/main/java/gwt/Common.gwt.xml \ foo/src/main/resources/context/datasource/local.xml \ foo/src/main/resources/context/environment/local.xml" for i in $IGNORE_FILES; do mv $DIR/$i $DIR/"$i"_; done; svn "$@" for i in $IGNORE_FILES; do mv $DIR/"$i"_ $DIR/$i; done;
显然,这是根据我的情况而定制的,但只需更改DIR和IGNORE_FILES以适合您的开发设置。 记住要将脚本更改为可执行文件:
sudo chmod +x /usr/bin/svnn
..然后你只需使用“svnn”而不是“svn”来运行subversion,而不用担心检查IGNORE_FILES列表上文件的本地修改。 我希望这有帮助!
我不相信有一种方法可以忽略存储库中的文件。 我们经常用web.config和其他configuration文件来解决这个问题。
虽然不完美,但我最常看到并使用的解决scheme是使用.default文件和一个nant任务来创build本地副本。
例如,在repo中是一个名为web.config.default
的文件,它具有默认值。 然后创build一个nant任务,将所有的web.config.default
文件重命名为web.config
,然后可以自定义为本地值。 当检索新的工作副本或运行构build时应该调用此任务。
您还需要忽略创build的web.config
文件,以使其不会提交到存储库。
查看更改列表 ,这可以为您提供一个选项来过滤掉已更改但不想提交的文件。 SVN不会自动跳过一个文件,除非你告诉它 – 而你告诉它这个文件与其他文件不同的地方是把它放在一个更改列表中。
它确实需要更多的工作,而且你只能将更改列表应用到你的工作副本(显然,想象一下,如果你可以将一个'never update'属性应用到修订版本上,那么可能会出现混乱。
我来到这个线程寻找一种方式来做一个“primefaces”提交的只是一些文件,而不是忽略提交一些文件我去了另一种方式,只提交了我想要的文件:
svn ci filename1 filename2
也许,这将有助于某人。
我刚刚find了一个解决scheme。 鉴于TortoiseSVN以我们想要的方式工作,我尝试在Linux下安装 – 这意味着在Wine上运行。 令人惊讶的是,它的作品! 你所要做的就是:
- 添加要跳过提交的文件:“svn changelist'ignore-on-commit'”。
- 使用TortoiseSVN提交:“〜/ .wine / drive_c / Program \ Files / TortoiseSVN / bin / TortoiseProc.exe / command:commit / path:'
- 排除的文件将被取消选中默认提交,而其他修改的文件将被检查。 这在Windows下是完全一样的。 请享用!
(为什么需要通过CLI排除文件的原因是因为没有find用于这样做的菜单条目,不知道为什么,任何方式,这很好!)
冲突的文件不被允许提交。 您可以利用此function将您的私人更改保留在存储库中。 这对于less量的文件效果最好。
为了获得对a-file
的冲突,你的工作拷贝(WC)没有来自版本库的最新的a-file
,并且你的WC中的a-file
变化与在存储库(您尚未更新的更改)。 如果您不想等待上述条件,则可以为此类a-file
创build冲突:
在工作副本1(WC1)中,将一行文本添加到a-file
的顶部,例如“在此处发生冲突” 。 使用必要的语法,以便不破坏存储库。 从WC1提交a-file
。 在WC2中,向a-file
的顶部添加不同的文本行,如“我想要冲突” 。 从WC2更新,现在一个文件应该是冲突的。
我会写一个帮助bash脚本,在所有你需要的文件上运行svn commit
,而不是你不需要的文件。 这样你有更多的控制。
例如,对于一行,您可以提交所有文件,扩展名为.h
和.cpp
,您对其进行更改(并且不会导致冲突):
svn commit -m "" `svn status | grep "^M.*[h|cpp]$" | awk '{print $2}' | tr "\\n" " "`
更改/添加扩展到[h|cpp]
部分。 如果需要,在-m ""
的引号之间添加日志消息。
一些build议的想法可以这样实现:
在PowerShell中的Windows上
将所有添加到默认list.ps1
dir -Recurse | ? { -not $_.PSIsContainer } | % { svn cl default $_.FullName }
添加忽略list.ps1
dir file1 ... filN % { $_.FullName } > ignore-on-commit cat .\ignore-on-commit | % { svn cl ignore-on-commit $_ } svn add ignore-on-commit
现在,你可以别名svn ci --changelist default
这样你就不必每次都指定它。 额外的好处是,你可以存储库中的忽略提交列表(如果你想的话)。
我这样做的一些文件,不断重新生成,但很less实际上手动改变。 例如,我将修订号添加到特定占位符上的configuration文件,以便在每次提交时更改文件,但手动更改很less。
我厌倦了等待这个内置到SVN。 我使用的tortoiseSVN忽略提交,但是popup一个用户对话框,你不能从命令行压制,当我运行我的构build脚本,去喝杯茶,我恨它时我回来发现它正在等待用户input10%的方式。
所以这里是一个Windows PowerShell脚本,只提交不在变更列表中的文件:
# get list of changed files into targets [XML]$svnStatus = svn st -q --xml C:\SourceCode\Monad # select the nodes that aren't in a changelist $fileList = $svnStatus.SelectNodes('/status/target/entry[wc-status/@item != "unversioned"]') | Foreach-Object {$_.path}; # create a temp file of targets $fileListPath = [IO.Path]::GetTempFileName(); $fileList | out-file $fileListPath -Encoding ASCII # do the commit svn commit --targets $fileListPath -m "Publish $version" --keep-changelists # remove the temp file Remove-Item $filelistPath
更新user88044的脚本。
这个想法是推动不要提交更改列表中的文件并运行恶意脚本。
该脚本从命令中提取不要提交的文件:svn status –changelist'do-not-commit'
#! / bin / bash DIR =“$(pwd)”
IGNORE_FILES =“$(svn status –changelist'do-not-commit'| tail -n +3 | grep -oE'[^] + $')”
我在$ IGNORE_FILES; 做mv $ DIR / $ i $ DIR /“$ i”_; 完成;
svn“$ @”;
我在$ IGNORE_FILES; 做mv $ DIR /“$ i”_ $ DIR / $ i; 完成;
脚本放在/ usr / bin / svnn(sudo chmod + x / usr / bin / svnn)
svnn状态,svnn提交等…
由于我面对完全相同的问题,并且我的Google使用一直不给我,我想我find了一个解决方法。 这是我做的,似乎为我工作,但由于我坚持使用旧版本的SVN(<1.5,因为它没有–keep-local选项),我不是专家,我不能确定这是一个通用的解决scheme。 如果它也适合你,请让我知道!
我正在处理从SVN获得的Prestashop安装,因为其他人已经开始对它进行操作了。 由于数据库设置是为另一台服务器完成的,因此我在/ config文件夹中的某个文件中对其进行了更改。 由于这个文件夹已经被版本化了,所以把它设置成svn:ignore不会阻止我对本地文件的修改被提交。 以下是我所做的:
cp config ../cfg_bkp # copy the files out of the repo svn rm config # delete files both from svn and "physically" svn propset svn:ignore "config" . # as the files no longer exists, I can add my ignore rule and then... mv ../cfg_bkp config # ...bring'em back svn revert --recursive config # make svn forget any existing status for the files (they won't be up for deletion anymore)
现在我可以运行svn add –force。 在没有添加我的configuration的回购根,即使它不匹配回购的版本(我想我将不得不通过所有这一切,如果我再次修改它,没有testing)。 我可以svn更新以及我的文件被覆盖或得到任何错误。
您可以使用TortoiseSVN直接configuration“ignore-on-commit”更改列表。 不需要configuration任何其他更改列表,包括所有其他文件
1)单击“SVN提交…”(我们不会提交,只是find更改列表的graphics菜单的方法)2)在列表上右键单击要排除的文件。 3)菜单:移动到更改列表> ignore-on-commit
下一次你做SVN提交…文件将显示在列表的末尾,在忽略提交类别下未选中。
经testing:TortoiseSVN 1.8.7,Build 25475 – 64位,2014/05/05 20:52:12,Subversion 1.8.9, – 释放
这是游戏迟到,但我发现这个问题最令人敬畏的命令行命令。 完成使用bash。 请享用。
svn status | grep -v excluding | sed 's/^A */"/g; s/$/"/g' | tr '\n' ' ' | xargs svn commit -m "My Message"
好的,下面是对命令的解释。 有些东西需要根据您的使用情况进行更改。
svn status
我得到所有文件的列表。 他们都将从这些状态字符开始(?,!,A等)。 每个都是自己的路线
grep -v excluding
我使用grep来过滤列表。 它可以正常使用(包括)或使用-v标志(排除)。 在这种情况下,它被用来排除,用“排除”这个短语来排除。
sed 's/^. */"/g; s/$/"/g'
现在我在每行的开始处删除状态字符和空格,然后使用sed引用每行。 我的一些文件名有空格,因此引用。
tr '\n' ' '
使用tr,我用空格replace所有换行符。 现在我的整个提交的文件列表是在一行。
xargs svn commit -m "My Message"
最后,我使用xargs来执行我的提交命令与消息。 它执行提交,并删除我的引用文件列表作为最后一个参数。
结果是一切最终都以我想要的方式运作。 我仍然有点厌恶svn强迫我跳过这些该死的箍,但我可以忍受这一点。 我猜。
svn:ignore
是你的答案。
例:
$ svn propset svn:ignore -F .cvsignore . property 'svn:ignore' set on '.'
svn propset "svn:ignore" "*.xml" .
*.xml
是要忽略的文件的模式; 你也可以在这里使用目录名称。