SVN:有没有办法将文件标记为“不提交”?


153

使用TortoiseSVN,我可以将文件移至“提交时忽略”更改列表,这样,当我提交整个树时,不会提交对该文件的更改。

有没有办法使用svn命令行工具执行类似的操作?

编辑:感谢您使用的建议svn:ignore,但这并不能完全满足我的要求。

svn:ignore影响类似svn add&的事情svn import。它提供了要忽略的文件名模式列表。

我有一个已经在源代码控制下的文件,但是我想对该文件进行临时更改,而在以后我提交整个源代码树时,我不想将其提交。我进行了许多其他更改,我可以在监视器上贴一个纸条,告诉我在提交树之前还原该文件,但是如果svn可以自动跳过该文件,那就太好了。


1
有一种使用个人分支和切换状态的方法。[见我的其他职位在这个问题上。] [1] [1]:stackoverflow.com/questions/862950/...
ptitpion

Answers:


120

截至2016年2月(版本1.9),Subversion没有内置的“不提交” /“忽略提交”功能。此答案是不理想的命令行解决方法

如OP所述,TortoiseSVN具有内置的更改列表“提交时忽略”,该更改列表自动从提交中排除。命令行客户端没有此功能,因此您需要使用多个变更列表来实现相同的行为(带有警告)

  • 一个您想提交的工作[工作]
  • 一种用于您想忽略的东西[提交时忽略]

由于存在TortoiseSVN的先例,因此在示例中,我对不想提交的文件使用“提交时忽略”。我将在工作文件中使用“工作”,但您可以选择所需的任何名称。

首先,将所有文件添加到名为“ work”的变更列表。这必须从您的工作副本的根目录运行:

svn cl work . -R

这将以递归方式将工作副本中的所有文件添加到名为“ work”的变更列表中。这有一个缺点-随着新文件添加到工作副本中,您将需要专门添加新文件,否则将不包括这些文件。其次,如果必须再次运行此命令,则需要再次重新添加所有“提交时忽略”文件。不理想-您可以像其他人一样开始在文件中维护自己的“忽略”列表。

然后,对于要排除的文件:

svn cl ignore-on-commit path\to\file-to-ignore

由于文件只能在一个变更列表中,因此在您之前的“工作”添加之后运行此添加操作将从“工作”变更列表中删除您要忽略的文件,并将其放在“提交时忽略”变更列表中。

当您准备要提交修改的文件时,您希望提交,然后只需在提交中添加“ --cl work”:

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.

一种替代方法是简单地将您要提交的每个文件添加到“工作”变更列表中,甚至不维护忽略列表,但这也是很多工作。实际上,唯一简单,理想的解决方案是在SVN本身中实现/何时实现。Subversion问题跟踪程序SVN-2858对此有一个长期存在的问题,以防将来发生变化。


1
我已经使用您提到的命令添加了两个文件: $svn st --- Changelist 'ignore-on-commit': M database.php M config.php 而且,它们已经在提交时发送到了仓库。知道我做错了什么吗?
Attila Fulop 2012年

7
将文件添加到更改列表“提交时忽略”本身并不阻止文件提交。TortoiseSVN(Windows GUI客户端)已针对“提交时忽略”而构建,但命令行svn却没有。我在原始答案中提出的唯一建议是将要提交的文件添加到变更列表中,并告诉其提交该文件
Joshua McKinnon 2012年

7
提交时忽略是绝对的Tortoise保留列表。它所要做的就是防止默认情况下在GUI中检查项目,因此这是Tortoise GUI的特定功能。如果使用GUI,则也不需要使用命令行将其添加到列表中。只是提交列表项上的上下文菜单,您可以在底部将它们移动到变更列表,并且已经定义了提交时忽略。tortoisesvn.net/docs/release/TortoiseSVN_en/...
tjmoore

这没做杰克。它承诺了一切。
ahnbizcad 2015年

不起作用,该问题专门询问了命令行解决方案,而不是GUI。
riv

26

我一直发现自己在这种情况下也:和修改列表不为我工作-我想使文件的短名单,我希望犯,而不是保持文件的大量列表我做的想承诺!

我在linux命令行上工作:所以我的解决方案是创建一个脚本/ usr / bin / svnn(是的,带有两个'n'!),如下所示:

#! /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”来运行转换,而不必担心要检查对IGNORE_FILES列表中文件的本地更改。我希望这有帮助!


最后,这个答案实际上是正确的。您需要编写一些工具。这实际上是不完美的,因为我想有一个动态选项,例如svnn ignore configs/*-带通配符,铃声和口哨声。我想我自己写类似的东西,然后回到这里!
Tomasz Gandor 2014年

这很棒!更好的是,在.bashrc中为svn-> svnn创建别名。甚至更好的是,它可以像git一样运行,而不是在命令中指定要忽略的文件,它将检查文件夹内的.ignore文件,并忽略与模式匹配的每个文件。
塔雷克,2015年

不必重新学习输入svnn,可以考虑调用它svn并将此脚本放在PATH开头的内容中,例如${HOME}/bin。然后从脚本本身调用/usr/bin/svn
Joost

17

我不认为有一种方法可以忽略存储库中的文件。我们经常在使用web.config和其他配置文件时遇到此问题。

尽管并不完美,但我最经常看到和使用的解决方案是拥有.default文件和创建本地副本的nant任务。

例如,回购中包含一个web.config.default具有默认值的文件。然后创建一个nant任务,它将所有web.config.default文件重命名为该文件web.config,然后可以将其自定义为本地值。当检索到新的工作副本或运行构建时,应调用此任务。

您还需要忽略所web.config创建的文件,以便不将其提交到存储库。


8

变更列表,它可以为您提供一个选项,以过滤出您已更改但不想提交的文件。除非您告诉SVN,否则SVN不会自动跳过文件-告诉该文件与其他文件某种方式的方法是将其放入更改列表。

它确实需要您做更多的工作,并且您只能将变更列表应用于您的工作副本(显然,想象一下,如果您可以对修订版应用“从不更新”属性,那么可能会造成混乱!)。


1
但这正是我们想要的。例如,您需要设置一个defaultUserId = yourId而不是系统默认值的源文件。
orbfish

4

我来到这个线程,寻找一种仅对某些文件进行“原子”提交的方法,而不是忽略提交时的某些文件,我改用另一种方式,只提交了我想要的文件:

svn ci filename1 filename2

也许会帮助某人。


您的回答只是该主题中的一个适当建议。svn ci只是的别名svn commit。提交命令允许对指定文件进行特定提交
oxfn 2014年

3

伙计们,我刚刚找到了解决方案。鉴于TortoiseSVN可以按照我们想要的方式工作,我尝试将其安装在Linux下-这意味着可以在Wine上运行。出乎意料的是它有效!您要做的就是:

  1. 通过运行以下命令添加要跳过提交的文件:“ svn changelist'ignore-on-commit'”。
  2. 使用TortoiseSVN提交:“〜/ .wine / drive_c / Program \ Files / TortoiseSVN / bin / TortoiseProc.exe / command:commit / path:”
  3. 默认情况下,不检查排除的文件是否提交,而其他已修改的文件将被检查。这与Windows下完全相同。请享用!

(之所以需要通过CLI排除文件的原因是因为找不到用于执行此操作的菜单项,不确定原因。无论如何,这很好用!)


2

不允许提交有冲突的文件。您可以利用此优势将您的私有更改拒之于存储库之外。这对于少数文件效果最佳。

为了解决冲突a-file,您的工作副本(WC)没有a-file来自存储库的最新信息,并且a-fileWC中的更改与存储库中的更改位于同一位置(未更新的更改)至今)。如果您不想等待上述条件,则可以这样创建冲突a-file
在工作副本1(WC1)中,在其顶部添加一行文本a-file,例如“在此处产生冲突”。使用必要的语法,以免破坏存储库。a-file从WC1 提交。在WC2中,在顶部添加另一行文本a-file,例如“我想要冲突”。从WC2更新,现在a文件应该存在冲突。


1

相反,我将编写一个svn commit在所有需要的文件上运行的帮助程序bash脚本,而不在不需要的文件上运行。这样,您可以控制更多。

例如,用一行可以提交所有具有扩展名.h并且已.cpp对其进行更改(并且不会引起冲突)的文件:

svn commit -m "" `svn status | grep "^M.*[h|cpp]$" | awk '{print $2}' | tr "\\n" " "`

更改/向[h|cpp]零件添加扩展。-m ""如果需要,在引号之间添加一条日志消息。


1

一些提议的想法可以这样实现:

在Windows中的PowerShell中

全部添加到默认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,而不必每次都指定它。另一个好处是,您可以将提交时忽略列表(如果需要)存储在存储库中。

我对一些不断刷新但很少手动更改的文件执行此操作。例如,我将修订号添加到特定占位符的配置文件中,因此每次提交时都会更改文件,但是很少手动更改。


1

我已经厌倦了等待将其内置到SVN中的麻烦。我当时使用的是tortoiseSVN并带有“忽略提交”功能,但这会弹出一个用户对话框,您无法从命令行中取消该对话框,当我运行构建脚本并去喝杯茶时,我讨厌它我回来发现它正在等待用户输入的10%。

因此,这是一个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

1

user88044脚本的更新。

这个想法是将文件推送到“不提交”更改列表中并运行恶意脚本。

该脚本从以下命令中提取不提交文件:svn status --changelist'不提交'

#!/ 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提交等。


1

您可以直接使用TortoiseSVN配置“提交时忽略”更改列表。无需配置任何其他变更列表,包括所有其他文件

1)单击“ SVN提交...”(我们不会提交,只是找到更改列表的图形菜单的一种方法)2)在列表上,右键单击要排除的文件。3)菜单:移至变更列表>提交时忽略

下次您执行SVN提交...时,文件将在列表末尾的提交时忽略类别下未选中显示。

经过测试:TortoiseSVN 1.8.7,Build 25475-64 Bit,2014/05/05 20:52:12,Subversion 1.8.9,-release


1
糟糕,我刚刚看到了tjmoore的评论,已经为tortoiseSVN用户提供了很好的信息...没有命令行 tortoisesvn.net/docs/release/TortoiseSVN_en/…–
luney

这在1.9中被破坏了吗?
Jake Hm

1

这对游戏来说太晚了,但是我找到了这个问题中最强大的命令行命令。使用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,我用空格替换所有换行符。现在,我要提交的整个文件列表都在一行上。

xargs svn commit -m "My Message"

最后,我使用xargs对消息执行我的commit命令。它执行提交,并删除我引用的文件列表作为最后一个参数。

结果是一切最终都会按照我想要的方式工作。我还是有点讨厌svn强迫我跳过这些该死的铁环,但是我可以忍受这个。我猜。


0

由于我正面临着完全相同的问题,而我的谷歌搜索功能却一无所获,所以我认为我找到了解决方法。这是我所做的,似乎对我有用,但是由于我坚持使用旧版本的SVN(<1.5,因为它没有--keep-local选项),因此我不是专家,我不确定这是一个通用解决方案。如果它也对您有用,请告诉我!

我正在处理我从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。在回购根目录下,无需添加我的配置,即使它与回购版本不匹配(我想如果我再修改一次,也没有测试,我将不得不再次进行所有这些操作)。我也可以进行svn更新,而不会覆盖我的文件或出现任何错误。


0

一种不忽略目录属性更改的解决方案

我尝试使用基于的解决方案changelist,但与此同时存在一些问题。首先,我的存储库中有成千上万个文件,因此要提交的变更列表非常庞大,并且我的svn status输出变得太长,需要对其进行解析才能有用。最重要的是,我想提交来自合并的更改,这意味着它们包括属性更改。提交变更列表时,未提交附加到目录的svn属性,因此我不得不执行额外的提交:

svn ci --cl work -m "this commits files from the work changelist only"
svn up
svn ci --depth empty DIR . -m "record merge properties"

您可能必须对多个目录(在此我记录DIR当前dir 的属性.)执行此操作,基本上是M在发出svn status命令时在第二列中带有a的目录。

我使用了补丁和svn patch。用伪代码:

svn diff $IGNORE_FILES > MYPATCH   # get the mods to ignore
svn patch --reverse-diff MYPATCH   # remove the mods
svn ci -m "message"                # check-in files and directory properties
svn patch MYPATCH                  # re-apply the mods

像其他海报一样,我最终使用脚本来维护要忽略的文件列表:

#! /usr/bin/env bash

finish() {
    svn patch MYPATCH               # re-apply the mods
}
trap finish EXIT

IGNORE_FILES="\
sources/platform/ecmwf-cca-intel-mpi.xml \
runtime/classic/platform/ecmwf-cca.job.tmpl \
runtime/classic/platform/ecmwf-cca-intel.xml"

svn diff $IGNORE_FILES > MYPATCH # get the mods to ignore
svn patch --reverse-diff MYPATCH # remove the mods

svn "$@"

我通常将其与ci和一起使用revert -R .



-9
svn propset "svn:ignore" "*.xml" .

*.xml是文件忽略的图案; 您也可以在此处使用目录名称。


3
-1,因为您不能忽略存储库中的文件。
zellus
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.