代码之家  ›  专栏  ›  技术社区  ›  Ferruccio

SVN:有没有一种方法可以将文件标记为“不提交”?

  •  160
  • Ferruccio  · 技术社区  · 16 年前

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

    有没有一种方法可以使用svn命令行工具来做这样的事情?

    svn:ignore ,但这并不完全符合我的要求。

    svn:忽略 svn add & svn import

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

    18 回复  |  直到 11 年前
        1
  •  120
  •   Joshua McKinnon    9 年前

    正如OP所述,TortoiseSVN有一个内置的更改列表“提交时忽略”,它会自动从提交中排除。 命令行客户端没有此功能,因此您需要使用多个更改列表来实现相同的行为(但有注意事项) :

    • 一个用于你想从事的工作
    • 一个是你想忽略的事情[提交时忽略]

    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

        2
  •  26
  •   user88044    13 年前

    #! /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
    

    ..然后,您只需使用“svnn”而不是“svn”来运行subversion,而不必担心检查IGNORE_FILE列表上文件的本地更改。我希望这能有所帮助!

        3
  •  19
  •   Steven Lyons    16 年前

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

    例如,在repo中有一个名为 web.config.default 它具有默认值。然后创建一个nant任务,该任务将重命名所有 web.config

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

        4
  •  8
  •   gbjbaanb    16 年前

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

        5
  •  4
  •   Radek    15 年前

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

    svn ci filename1 filename2
    

    也许,它会帮助别人。

        6
  •  3
  •   James Fu    14 年前

    伙计们,我刚刚找到了一个解决方案。鉴于TortoiseSVN按照我们想要的方式工作,我尝试在Linux下安装它,这意味着在Wine上运行。令人惊讶的是,它竟然奏效了!你所要做的就是:

    1. 通过运行以下命令添加要跳过提交的文件:“svn changelist'ignore on commit'”。

    (需要通过CLI排除文件的原因是找不到执行此操作的菜单项,不确定为什么。无论如何,这都很有效!)

        7
  •  2
  •   phi    16 年前

    不允许提交冲突的文件。您可以利用这一点将您的私有更改保留在存储库之外。这在少量文件中效果最佳。

    为了引发冲突 a-file a文件 从存储库中 a文件 a文件 这样地:
    a文件 ,例如 。使用必要的语法,这样就不会破坏存储库。提交 a文件 a文件 ,比如 “我想要冲突”

        8
  •  1
  •   Alan Turing    14 年前

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

    2) 在列表中右键单击要排除的文件。 3) 菜单:移动到更改列表>提交时忽略

    下次你进行SVN提交时。..这些文件将在列表末尾的提交时忽略类别下显示为未选中。

    测试使用:TortoiseSVN 1.8.7,内部版本25475-64位,2014/05/05 20:52:12,Subversion 1.8.9,发布

        9
  •  1
  •   majkinetor    12 年前

    svn commit 在所有你需要的文件上,没有你不需要的文件。这样你就有了更多的控制权。

    例如,只需一行,您就可以提交所有扩展名为的文件 .h .cpp 您对其进行了更改(并且不会导致冲突):

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

    更改/添加扩展名 [h|cpp] 部分。在引号之间添加日志消息 -m ""

        10
  •  1
  •   Ben Curthoys    12 年前

    一些拟议的想法可以这样实施:

    在PowerShell中的Windows上

    将所有内容添加到默认列表.psp

    dir -Recurse | ? { -not $_.PSIsContainer } | % { svn cl default $_.FullName }
    

    添加到忽略list.py

     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

    我这样做是为了处理一些不断重新生成但很少手动更改的文件。例如,我在特定占位符的配置文件中添加了修订号,这样每次提交时都会更改文件,但手动更改的情况很少见。

        11
  •  1
  •   Nicolas F.    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
    
        12
  •  1
  •   luney    9 年前

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

    DIR=“$(pwd)”

    对于$IGNORE_FILE中的i;做mv$DIR/$i$DIR/“$i”_;完成;

    svn“$@”;

    svnn状态、svnn提交等。。。

        13
  •  1
  •   craigmiller160    8 年前

    这是游戏的后期,但我找到了解决这个问题的最棒的命令行命令。使用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
    

    sed 's/^. */"/g; s/$/"/g'
    

    现在,我删除了每行开头的状态字符和空格,然后使用sed引用每行。我的一些文件名中有空格,因此有引号。

    tr '\n' ' '
    

    xargs svn commit -m "My Message"
    

        14
  •  0
  •   neemzy    13 年前

    由于我面临着完全相同的问题,我的谷歌一直没有给我任何东西,我想我找到了一个解决方法。这是我所做的,它似乎对我有效,但由于我坚持使用旧版本的SVN(<1.5,因为它没有--keep local选项),而且我不是它的专家,我不能确定这是一个通用的解决方案。如果它也对你有效,请告诉我!

    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)
    

        15
  •  0
  •   P. Le Sager    7 年前

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

    我尝试使用基于以下内容的解决方案 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 以及当前目录 . M 命令。

    解决方案

    我使用了补丁和 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 . .

        16
  •  0
  •   Sameer    5 年前

    如果你在linux上,下面的答案会很有用

    创建 .svnignore 将文件放在工作副本的根级别,并在每一行中添加文件夹/文件(例如,下面)

    \.
    folder1
    folder2
    folder3/file2.html
    folder4/file1.js
    

    注意:您还需要添加 \.

    svn st -u 然后复制并粘贴相同的路径

    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 ║
    ╚════════════════════╩════════════════════════════════════════════════════════════════════════════════════════════════════════╝
    
        17
  •  -1
  •   Eugene Yarmash    9 年前

    svn:ignore is your answer.

    $ svn propset svn:ignore -F .cvsignore .
    property 'svn:ignore' set on '.'
    
        18
  •  -9
  •   Eugene Yarmash    9 年前
    svn propset "svn:ignore" "*.xml" .
    

    *.xml 是要忽略的文件模式; 您也可以在此处使用目录名。