【问题标题】:Exclude some files on svn command line commit (not svn:ignore)排除 svn 命令行提交上的一些文件(不是 svn:ignore)
【发布时间】:2012-01-20 23:17:14
【问题描述】:

我正在和很多人一起开发。

我检查了远程存储库,得到了 3 个文件。编辑后运行:

svn status

它显示:

M file_1
M file_2
M file_3

现在,我只想提交两个文件:file_1、file_2,而不是 file_3。

怎么做?

我不想用

svn revert file_3

在提交之前。

说明:我编辑 file_1,file_2 用于共享项目,file_3 仅在我的本地机器上运行。

【问题讨论】:

    标签: svn commit ignore revert


    【解决方案1】:

    扩展 zoul 的答案.. 以开发您使用的文件列表:

    svn stat |  grep -v ignore.file | perl -ne 'chop; s/^.\s+//; print "$_ "'
    

    或者,如果您有带空格的文件名,请使用:

    svn stat |  grep -v ignore.file | perl -ne 'chop; s/^.\s+//; print "\"$_\" "'
    

    【讨论】:

    • svn stat ,向我们展示我们必须提交哪些文件,我们只需要选择那些文件,谢谢。
    • 感谢您为这个问题提供了一个有用的答案。
    【解决方案2】:

    怎么样:

    $ svn commit file_1 file_2
    

    【讨论】:

    • 好的,如果我有 100 个文件我想提交并且只想排除一个。有办法吗?
    • 只用shell,比如让SVN列出所有修改过的文件,然后grep -v一个。
    【解决方案3】:

    bash 一行:

    svn ci $(svn stat | grep -v exclude.file)
    

    【讨论】:

    • 我将其更改为 svn ci $(svn stat | grep -v ^?| grep -v exclude.file) ,只是为了过滤掉不在存储库中的文件,例如构建的二进制文件从来源。否则,svn 会抱怨它们并且不会提交任何东西,错误信息类似于 svn: E200009: 'a.file' is not under version control
    • 这不起作用,因为每行开头的文件状态字母。你必须改用这个:svn ci $(svn stat | grep -v exclude.file | awk '{print $2}')
    【解决方案4】:

    只需将要提交的文件路径附加到 svn commit 命令即可:

    svn commit file_1 file_2
    

    http://svnbook.red-bean.com/en/1.7/svn.ref.svn.c.commit.html

    【讨论】:

      【解决方案5】:

      我最终制作了一个包含以下内容的脚本:

      svn ci $(svn diff --summarize | \
          grep -v exclude.file1 | \
          grep -v exclude.file2 | \
          ...
          grep -v exclude.fileN \
      )
      

      我相信有人可以通过让这个脚本读取一个包含要从提交中排除的文件列表的文件来使其更加灵活。

      【讨论】:

      • 你是真正的 MVP。这是在涉及外部时唯一有效的方法。否则,你会捡起额外的带有垃圾的行,比如“status”。
      【解决方案6】:

      这是一个 Windows Powershell 版本,它只提交不在更改列表中的文件。创建一个名为 ignore-on-commit 的更改列表(Tortoise SVN 无论如何都会理解)并将您不想提交的文件放入其中。

      # 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
      

      【讨论】:

        【解决方案7】:

        也许你可以使用这个命令。

        svn ci `svn st | grep -e "^[A|M]" | grep -v "test.js" | grep -ve "conf\.js$" | awk '{print $2}' | tr "\\n" " "`
        

        【讨论】:

        • 文件名中有空格时不起作用,因为 AWK 不会打印整个文件名
        猜你喜欢
        • 1970-01-01
        • 2012-12-01
        • 1970-01-01
        • 2011-02-03
        • 1970-01-01
        • 2023-01-18
        • 2016-06-22
        • 2020-07-16
        • 1970-01-01
        相关资源
        最近更新 更多