代码之家  ›  专栏  ›  技术社区  ›  Adam Paynter

Subversion:只检查在特定提交过程中受影响的文件

  •  17
  • Adam Paynter  · 技术社区  · 17 年前

    在Subversion中,是否可以检查 在特定提交过程中受影响的文件,前提是您知道具体的修订号?

    13 回复  |  直到 8 年前
        1
  •  12
  •   mikej heading_to_tahiti    17 年前

    我认为Subversion签出只能签出特定的文件夹,而不能签出单个文件。也就是说,命令:

    svn log -r *revision* -q -v
    

    将列出与指定修订版相关的更改,以便您在签出完整目录的工作文件夹后,可以处理此命令的输出,以帮助将所需的文件复制到某个位置。

        2
  •  4
  •   animuson    14 年前

    您可以获得自特定修订以来修改的文件列表,如下所示:

    svn diff -r [REVNUM]:HEAD --summarize > fileschanged.txt
    

    然后创建一个脚本来签出filechanged.txt中的每个文件

        3
  •  2
  •   Ned Batchelder    17 年前

    我认为你可能在这里使用CVS意义上的“检出”一词,即“svn更新”。是吗?

    如果是这样,那么您可以更新到所需的特定版本:

    svn update -r12345
    

    或者甚至只是那些修订版的文件:

    svn update -r12345 file1 file2 file3
    

    不过,您必须使用其他一些建议从svn获取文件列表。

        4
  •  2
  •   Dominic Rodger    17 年前

    我知道这有点离题,但我使用TRAC来做到这一点,它只将2个版本之间修改过的文件导出为zip存档,并将文件保存在其原始目录结构中。

        5
  •  1
  •   William Leara    17 年前

    我需要一份在十几次修订范围内更改的所有文件的转储。我是这样做的(这些命令可能并不完美,这只是一个一般性的解释):

    创建一个差异,显示您需要的文件,并将列表写入文本文件

    svn diff --summarize -r219:232 > r219-232_Summary.txt
    

    这将为您提供一个包含以下行的文本文件

    M      path/to/file.php
    

    调整文件格式,将每行的开头替换为“svn up”命令,而不是“A”或“M”或其他任何命令。

     sed -i 's/A      /svn up /g' ./r219-232_Summary.txt
    

    …这会给你像这样的线条

    svn up path/to/file.php
    

    创建一个新目录并将您的项目签出到其中

    svn co http://www.repo.net/whatever
    

    删除目录中除.svn文件之外的所有内容(我使用的是相对较新的svn客户端,所以如果你使用的是每个目录中都有.svn的旧svn客户端的话,我不确定它是如何工作的)

    rm -rf ./*
    

    复制文本文件,使其可执行,并将其作为脚本运行。

    cp /path/to/wherever/r219-232_Summary.txt ./r219-232_Summary.sh
    chmod 777 ./r219-232_Summary.sh
    ./r219-232_Summary.sh
    

    如果一切按计划进行,那么shell应该解析文本文件中的每个“svn up”命令,并仅用您感兴趣的文件填充目录。

        6
  •  1
  •   Nikolai Ruhe    17 年前

    svn checkout 仅在目录级别工作,不在文件级别工作。当然,如果特定变更集中的所有更改都来自同一目录,那么您可以执行 svn checkout <url> <path> -r<revid> .

        7
  •  1
  •   Community Mohan Dere    9 年前

    您可以使用以下命令检查受影响文件的列表 svn log -q -v -r123 url .

    如果你真的只想得到受影响的文件,你可以使用 svn cat urlToFile -r123 > myfile 对于每个文件。

        8
  •  1
  •   Dan    14 年前

    如果你使用的是最新版本的svn,你可以签出一个空文件夹,然后更新特定的文件。

    在获得要选择的文件列表后,

    svn co --depth=empty url dest
    cd dest
    svn up file1 file2 file3
    

    编辑:与此处接受的答案几乎相同的解决方案: Checkout one file from Subversion

        9
  •  1
  •   siliconrockstar    11 年前

    这里有一种方法。

    svn co-深度为空svn://myrepository/mytrunk

    svn diff-c[REVNUM]svn://myrepository/mytrunk|grep“索引:”|awk'{print$2}'|xargs-n 1 svn更新--父项

    awk单行程序的输出是一个用相对路径更改的文件列表。如前所述,更新适用于单个文件,而签出适用于模块。“--parents”选项根据需要强制在工作副本中创建目录。

    请注意,更新还有一个“--changelist”选项(至少在1.7.1+版本中),但它似乎没有达到我想要的效果。

        10
  •  1
  •   L2M    10 年前

    #!/bin/bash
    
    REVISION=${1}
    REPOSITORY="${2}"
    DEST_PATH="${3}"
    SEARCH_PATTERN="trunk"
    FILES=$(svn log -q -v  $REPOSITORY -r $REVISION | grep $SEARCH_PATTERN)
    
    mkdir -p $DEST_PATH
    for FILE in $FILES ; do
        if [[ $FILE == *"$SEARCH_PATTERN"* ]]
        then
              FOLDER=$(dirname $FILE)
              mkdir -p $DEST_PATH/$FOLDER
          svn export -r $REVISION $REPOSITORY/$FILE $DEST_PATH/$FOLDER
        fi
    done
    
    #EOF
    
        11
  •  0
  •   PanCrit    17 年前

    您可以使用以下命令获取特定更改中的文件列表

    svn log -v -q -r rev

    然后,您可以用类似管道的工具清理管线前部的标记

    sed -e "s/^ . / /" | egrep -v "Changed paths:|-----"

    。为了只获取文件,您可能会使用 svn cat 正如尼古拉所建议的那样。

    [编辑以清理和简化sed管道。]

        12
  •  0
  •   tom    16 年前

    很抱歉重新提出了一个早已过时的问题,但它从未得到我满意的回答。

    您可以使用SVNKit构建一个简单的工具来实现这一点。我发现了这个 blog 关于它,并根据我的需要稍微修改了代码。直到今天,我还在部署过程中使用它。

    它做的是导出而不是结账,但我相信这将是一个简单的改变。

        13
  •  0
  •   vsingh    14 年前

    svn合并信息--显示符合条件的revs http://base.com.rev1 http://base.com.rev2

    现在,您想查看每个修订中的文件列表。 因此,将修订列表复制到记事本或editplus中,并进行修改,使其适合一行

    svn log-r r33521-r33762-3456-r5623-q-v>>missedFiles.txt

    注意:我进行了118次修订,但无法正确获取文件列表。因此,我通过分解修订子集来运行上述命令

    推荐文章