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

SVN:有没有办法将文件标记为;“不提交”吗;?,svn,command-line,Svn,Command Line,使用TortoiseSVN,我可以将一个文件移动到提交时忽略更改列表中,这样当我提交整个树时,对该文件的更改不会被提交 有没有一种方法可以使用svn命令行工具执行类似的操作 编辑:感谢您建议使用svn:ignore,但这并不是我想要的 svn:ignore会影响svn add&svn import等内容。它给出了一个要忽略的文件名模式列表 我有一个已经在源代码管理下的文件,但我想对该文件进行临时更改,我不想在以后提交整个源代码树时提交这些更改。我正在做很多其他的更改,我可以在监视器上贴个便条,告

使用TortoiseSVN,我可以将一个文件移动到提交时忽略更改列表中,这样当我提交整个树时,对该文件的更改不会被提交

有没有一种方法可以使用svn命令行工具执行类似的操作

编辑:感谢您建议使用
svn:ignore
,但这并不是我想要的

svn:ignore
会影响
svn add
&
svn import
等内容。它给出了一个要忽略的文件名模式列表

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

例如:

$ svn propset svn:ignore -F .cvsignore .
property 'svn:ignore' set on '.'
*.xml
是要忽略的文件模式;
您也可以在这里使用目录名。

我认为没有办法忽略存储库中的文件。我们经常在web.config和其他配置文件中遇到这种情况

虽然不是完美的,但我最常看到和使用的解决方案是使用.default文件和nant任务来创建本地副本

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

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

签出,它可以为您提供一个选项,以筛选出已更改但不想提交的文件。SVN不会自动跳过一个文件,除非你告诉它-你告诉它这个文件与其他文件不同的方式是把它放在变更列表中

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

Subversion没有内置的“不提交”/“提交时忽略”功能,从2016年2月/1.9版开始。这个答案不是理想的命令行解决方法 正如OP所述,OrtoiseSVN有一个内置的变更列表,“提交时忽略”,它自动从提交中排除命令行客户端没有此功能,因此您需要使用多个变更列表来完成相同的行为(附带警告)

  • 一个用于你想做的工作[工作]
  • 一个用于您想要忽略的内容[提交时忽略]
因为有陆龟VN的先例,我在我的示例中对我不想提交的文件使用“提交时忽略”。我会用“工作”来表示我所做的文件,但是你可以选择任何你想要的名字

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

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

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

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问题跟踪程序中有一个长期存在的问题,如果将来发生更改,则不允许提交冲突的文件。您可以利用这一点将您的私有更改保留在存储库之外。这对少量文件最有效

要获取
a-file
的冲突,您的工作副本(WC)没有存储库中最新的
a-file
,并且WC中的
a-file
的更改与存储库中的更改位于同一位置(您尚未更新到的更改)。如果您不想等待上述条件,可以为
a-file
创建冲突,如下所示:

在工作副本1(WC1)中,在
a-file
顶部添加一行文本,例如“在此处制造冲突”。使用必要的语法,以免破坏存储库。从WC1提交
a-file
。在WC2中,在
a-file
的顶部添加一行不同的文本,如“我想要冲突”。从WC2更新,现在a文件应该冲突

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

svn ci filename1 filename2

也许,它会对某人有所帮助。

相反,我会编写一个helper bash脚本,在所有需要的文件上运行
svn commit
,而不需要的文件都不运行。这样你就有了更多的控制权

例如,使用一行,您可以提交扩展名为
.h
.cpp的所有文件
svn ci filename1 filename2
svn commit -m "" `svn status | grep "^M.*[h|cpp]$" | awk '{print $2}' | tr "\\n" " "`
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)
#! /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;
sudo chmod +x /usr/bin/svnn
dir -Recurse | ? { -not $_.PSIsContainer } | % { svn cl default $_.FullName }
 dir file1 ... filN  % { $_.FullName } > ignore-on-commit
 cat .\ignore-on-commit | % { svn cl ignore-on-commit $_ }
 svn add ignore-on-commit
# 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
svn status | grep -v excluding | sed 's/^A */"/g; s/$/"/g' | tr '\n' ' ' | xargs svn commit -m "My Message"
svn status
grep -v excluding
sed 's/^. */"/g; s/$/"/g'
tr '\n' ' '
xargs svn commit -m "My Message"
svn ci --cl work -m "this commits files from the work changelist only"
svn up
svn ci --depth empty DIR . -m "record merge properties"
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 "$@"
\.
folder1
folder2
folder3/file2.html
folder4/file1.js
svn ci -m "YOUR-COMMENT-HERE" $(svn st | grep -v -w -f .svnignore | awk '{print $NF}')
╔════════════════════╦════════════════════════════════════════════════════════════════════════════════════════════════════════╗
║ svn ci             ║ Shorthand for svn commit                                                                               ║
╠════════════════════╬════════════════════════════════════════════════════════════════════════════════════════════════════════╣
║ svn st             ║ Shorthand for svn status                                                                               ║
╠════════════════════╬════════════════════════════════════════════════════════════════════════════════════════════════════════╣
║ |                  ║ Pipe(|) is used to pass output of previous command to next command's input                             ║
╠════════════════════╬════════════════════════════════════════════════════════════════════════════════════════════════════════╣
║ grep               ║ grep is a linux command to filter                                                                      ║
╠════════════════════╬════════════════════════════════════════════════════════════════════════════════════════════════════════╣
║ grep -v            ║ Give result other than matched (Inverse)                                                               ║
╠════════════════════╬════════════════════════════════════════════════════════════════════════════════════════════════════════╣
║ grep -w            ║ Exact match(used to match literal Dot(.))                                                              ║
╠════════════════════╬════════════════════════════════════════════════════════════════════════════════════════════════════════╣
║ grep -f filename   ║ Read pattern from file                                                                                 ║
╠════════════════════╬════════════════════════════════════════════════════════════════════════════════════════════════════════╣
║ awk '{print $NF}') ║ print last column data (columns are divided with space delimiter), used to get exact folder/file names ║
╚════════════════════╩════════════════════════════════════════════════════════════════════════════════════════════════════════╝