代码之家  ›  专栏  ›  技术社区  ›  Benjamin Peterson

检查已删除文件的历史记录

  •  152
  • Benjamin Peterson  · 技术社区  · 16 年前

    如果我在Subversion中删除一个文件,我如何查看它的历史记录和内容?如果我试着去做 svn cat svn log 对于不存在的文件,它会抱怨该文件不存在。

    svn add 它回来了吗?

    (我特别询问了Subversion,但我也想听听Bazaar、Mercurial和Git如何处理这个案件。)

    17 回复  |  直到 11 年前
        1
  •  153
  •   Bert Huijben    16 年前

    当您想查看旧文件时,您确实应该知道以下两者之间的区别:

    svn cat http://server/svn/project/file -r 1234
    

    svn cat http://server/svn/project/file@1234
    

    第一个版本将查看以下路径: 现在 可用作 http://server/svn/project/file 并检索该文件,与版本1234中的相同。(所以这个语法是正确的 文件删除后的工作)。

    第二种语法获取可用的文件 http://server/svn/project/file 在第1234版中。所以这个语法 处理已删除的文件。

    您甚至可以结合使用这些方法来检索修订版2345中可用的文件

    svn cat http://server/svn/project/file@2345 -r 1234
    
        2
  •  97
  •   mjy    16 年前

    首先,查找删除文件的修订号:

    svn log -v > log.txt
    

    然后在log.txt(不是SVN专家,所以我不知道更好的方法)中查找

    D <deleted file>
    

    看看是哪个版本。然后,与其他答案一样,使用以前的版本重新生成文件。

        3
  •  87
  •   Stefan    15 年前

    要获取已删除文件的日志,请使用

    svn log -r lastrevisionthefileexisted
    

    如果要恢复文件并保留其版本历史记录,请使用

    svn copy url/of/file@lastrevisionthefileexisted -r lastrevisionthefileexisted path/to/workingcopy/file
    

    如果您只希望文件内容未设置版本(例如,用于快速检查),请使用

    svn cat url/of/file@lastrevisionthefileexisted -r latrevisionthefileexisted > file
    

    在任何情况下,都不要使用“svn up”恢复已删除的文件!

        4
  •  25
  •   Dustin    16 年前

    在git中没有什么特别的。如果您知道该文件的名称,可以通过日志查找删除该文件的更改:

    git log -n 1 -- filename
    

    然后,您可以使用该提交来获取删除之前存在的文件。

    git checkout [last_revision]^ filename
    

    例子:

    dhcp-120:/tmp/slosh 587% ls -l slosh.tac
    ls: slosh.tac: No such file or directory
    dhcp-120:/tmp/slosh 588% git log -n 1 -- slosh.tac
    commit 8d4a1f1a94e4aa37c1cb9d329a140d08eec1b587
    Author: Dustin Sallings <dustin@spy.net>
    Date:   Mon Dec 15 11:25:00 2008 -0800
    
        Get rid of a .conf and replace it with .tac.
    dhcp-120:/tmp/slosh 589% git checkout 8d4a1f^ slosh.tac
    dhcp-120:/tmp/slosh 590% ll slosh.tac
    -rw-------  1 dustin  wheel  822 Dec 30 12:52 slosh.tac
    

    请注意,这实际上并不会将文件放回修订控制中。它只是将处于最终状态的文件拖放到当前位置。然后,您可以添加它或只是从该点检查它或任何东西。

        5
  •  17
  •   Mark Foreman    14 年前

    仅使用GUI的解决方案:

    如果你知道文件名,但是 甚至它的路径:

    1. 从Repo浏览器在根目录上执行“显示日志”
    2. 点击“全部显示”(在日志对话框底部)
    3. 在过滤器文本框中键入文件名(在日志对话框顶部)

    这将仅显示添加/修改/删除文件的修订。 这是您的文件历史记录。

    请注意,如果文件是通过删除其父文件夹之一而删除的,则日志中不会有“已删除”条目(因此mjy的解决方案将不起作用)。在这种情况下,其在过滤日志中的最新条目将与删除时的内容相对应。

        6
  •  13
  •   Jonas Byström    12 年前
    svn log -v | grep -B50 YourDeletedFileName
    

    将为您提供路径和修订。在git中(还检查重命名):

    git log --diff-filter=DR --name-only | grep -B50 YourDeletedFileName
    
        7
  •  9
  •   JMB    10 年前

    如果您不知道删除文件的路径,那么您可以 搜索 svn log

    svn log --search <deleted_file_or_pattern> -v
    

    该命令可能会像不使用搜索选项时一样对服务器进行重击,但至少其他相关资源(包括您的眼球)会松一口气,因为这将告诉您该文件是在哪个版本中删除的。然后,您可以遵循其他提示(主要使用相同的 svn日志 命令,但已在定义的路径上)。

        8
  •  8
  •   Pieter    16 年前

    $ git show 8d4a1f^:slosh.tac
    

    :分隔修订和该修订中的路径,有效地在特定修订中请求特定路径。

        9
  •  8
  •   Alexander Amelkin    12 年前

    使用此命令:

    svn log -v | awk '/^r[0-9]+/ { rev = $1; }; / D .*filename_escaped_for_regex/ { print rev" "$2; };'
    

    也就是说,如果您正在搜索文件自述,那么 /src/README , /src/README.first /some/deeply/hidden/directory/READMENOT

    如果你的 文件名 包含斜杠(路径)、点或其他特殊正则表达式字符,不要忘记转义它们以避免不匹配或错误。

        10
  •  5
  •   dekeguard    13 年前

    1. 如何查看Subversion中已删除文件的历史记录?
    2. 在Subversion中如何查看已删除文件的内容?
    3. 如何在Subversion中恢复已删除的文件?

    我在这里看到的所有答案都是关于问题2和3的。

    问题1的答案是:

    svn log http://server/svn/project/file@1234
    

        11
  •  4
  •   PhiLho    12 年前

    啊,既然我在学习使用集市,我就试过了。如果没有成功,你似乎就不能 log and annotate removed files

    > bzr log -r 3 Stuff/ErrorParser.hta
    bzr: ERROR: Path does not have any revision history: Stuff/ErrorParser.hta
    

    但奇怪的是(幸运的是),我能做到:

    > bzr cat -r 3 Stuff/ErrorParser.hta
    

    > bzr diff -r 2..3 Stuff/ErrorParser.hta
    

    正如上面的错误所暗示的:

    > bzr log -v | grep -B 1 ErrorParser
    

    (调整 -B ( --before-context

        12
  •  1
  •   Jack M.    16 年前

    您需要指定一个修订。

    svn log -r <revision> <deleted file>
    
        13
  •  1
  •   Community CDub    8 年前

    如果您想在重命名文件之前查看文件的历史记录,请参见 a comment here 你可以用

    git log --follow -- current_file_name
    
        14
  •  1
  •   nshew13    12 年前

    我想要一个答案,我自己。尝试以下操作以仅输出从中删除的内容 svn log .

    svn log --stop-on-copy --verbose [--limit <limit>] <repo Url> | \
    awk '{ if ($0 ~ /^r[0-9]+/) rev = $0 }
      { if ($0 ~ /^ D /) { if (rev != "") { print rev; rev = "" }; print $0 } }'
    

    awk awk 缓冲它找到的每个修订行,仅当找到删除记录时才输出它。每个修订只输出一次,因此一个修订中的多个删除将分组在一起(如在标准中) svn日志 输出)。

    您可以指定 --limit 减少返回的记录数量。您还可以删除 --stop-on-copy ,视需要而定。

    我知道有人抱怨解析整个日志的效率。我认为这是一个比grep及其“撒网”更好的解决方案 -B svn日志 . 它类似于@Alexander Amelkin的答案,但不需要特定的名称。这也是我的第一次 awk 脚本,所以它可能是非传统的。

        15
  •  1
  •   Daniel YC Lin    8 年前

    cd ~/src/a/b/c  # to the directory where you do the svn rm or svn mv command
    #cd ~/src   # if you forget the correct directory, just to the root of repository
    svn log -v | grep -w -B 9 deleted.file | head  # head show first 10 lines
    

    样本输出,在r90440处找到

    ...
    r90440 | user | 2017-02-03 11:55:09 +0800 (Fri, 03 Feb 2017) | 4 lines
    Changed paths:
      M /src/a/b/c/foo
      M /src/a/b/c/bar
      D /src/a/b/c/deleted.file
    

    将其复制回以前的版本(90439=90440-1)

    svn cp URL_of_deleted.file@90439 .
    
        16
  •  0
  •   Sebo.PL    8 年前

    您可以使用二进制搜索找到提供文件的最新版本。 /bin/bash

    function svnFindLast(){
     # The URL of the file to be found
     local URL="$1"
     # The SVN revision number which the file appears in (any rev where the file DOES exist)
     local r="$2"
     local R
     for i in $(seq 1 "${#URL}")
      do
       echo "checkingURL:'${URL:0:$i}'" >&2
       R="$(svn info --show-item revision "${URL:0:$i}" 2>/dev/null)"
       echo "R=$R" >&2
       [ -z "$R" ] || break
     done
     [ "$R" ] || {
      echo "It seems '$URL' is not in a valid SVN repository!" >&2
      return -1
     }
     while [ "$r" -ne "$R" -a "$(($r + 1))" -ne "$R" ]
     do
      T="$(($(($R + $r)) / 2))"
      if svn log "${URL}@${T}" >/dev/null 2>&1
       then
        r="$T"
        echo "r=$r" >&2
       else
        R="$T"
        echo "R=$R" >&2
      fi
     done
     echo "$r"
    }
    
        17
  •  -1
  •   thinsoldier    10 年前

    我编写了一个php脚本,将我所有存储库的svn日志复制到一个mysql数据库中。我现在可以对我的评论或文件名进行全文搜索。