삭제 된 파일의 기록 검사


159

Subversion에서 파일을 삭제하면 파일의 기록과 내용을 어떻게 볼 수 있습니까? 내가 svn cat없거나 svn log존재하지 않는 파일을 시도 하면 파일이 존재하지 않는다고 불평합니다.

또한 파일을 부활 시키려면 svn add다시 되돌려 야합니까?

(Subversion에 대해 구체적으로 질문했지만 Bazaar, Mercurial 및 Git도이 사례를 처리하는 방법에 대해 듣고 싶습니다.)

답변:


84

삭제 된 파일의 로그를 얻으려면

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'을 사용하지 마십시오!


2
파일을 삭제 한 버전의 역 병합을 수행하여 파일을 다시 만들 수도 있습니다. 이것은 SVN 문서에서 권장되는 절차입니다. "svn up"을 사용하는 것에 관해서는, "당신이 원하는 것을하지 않을 것"이므로 "하지 마십시오"의 문제는 아닙니다.
rmeador

5
그래도 파일의 전체 기록을 어떻게 볼 수 있습니까?
Benjamin Peterson

71
단순 : '-v'스위치를 사용하여 상위 폴더의 로그를 표시합니다. 모든 항목에 대해 변경된 경로 목록이 표시됩니다. 앞에 'D'가있는 파일과 삭제 된 파일의 이름을 찾으십시오. 파일이 삭제 된 버전입니다.
Stefan

8
삭제 된 파일에는 작동하지 않는 것 같습니다. 이것을 시도하면 다음 오류 메시지가 나타납니다. svn cat [url] /trunk/include/syeka/poster_funk.incl.php -r 50> out.txt svn : '/ admintools /! svn / bc / 131 / trunk / include / syeka / poster_funk.incl.php 'path not found 작업 솔루션에 대한이 스레드 아래의 @Bert Huijben의 응답을 참조하십시오.
Keith Palmer Jr.

2
커밋이 100,000 인 리포가있는 경우 "lastrevisionthefileexisted"는 찾기 쉽지 않습니다!
Jon Watte

151

오래된 파일을보고 싶을 때 실제로 다음과 같은 차이점을 알아야합니다.

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

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

첫 번째 버전은 현재 http : // server / svn / project / file 로 사용 가능한 경로를보고 수정 버전 1234에서와 같이 해당 파일을 검색합니다. 따라서이 구문은 파일 삭제 후에 작동 하지 않습니다 .

두 번째 구문은 사용할 수 있었던 파일 가져 // 서버 / SVN / 프로젝트 / 파일 : HTTP 버전이 구문은 그래서 1234에서 합니까 삭제 된 파일에 대한 작업을.

이 방법을 조합하여 개정 2345에서 http : // server / svn / project / file로 사용 가능 하지만 1234의 내용으로 다음과 같은 파일을 검색 할 수 있습니다 .

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

7
가, 고마워! 이 글타래의 현재 최상위 응답은 이것을 언급하지 않습니다, 이것은 훌륭합니다!
Keith Palmer Jr.

로컬 svn 클라이언트가 디렉토리가 존재하지 않을 ./local/file때 해결할 수 없을 때 오류를 냈기 때문에 절대 경로를 사용하지 않으면 여전히 실패했습니다 ./local. SVN의 최신 버전에서는 문제가되지 않을 수 있습니다.
데릭 라이스

2
@DerrickRice :이 경우 ^표기법이 편리합니다. 저장소 루트를 참조하므로 svn cat ^/local/file@REV저장소 루트와 URL 사이의 거리에 따라 말할 수 있습니다 .
musiphil

이것은 원칙적으로 훌륭하게 작동합니다. 폴더의 경우 다음이 수신됩니다.svn: E200009: Could not cat all targets because some targets are directories
Barney

이것이 가장 좋은 대답입니다. 가장 높은 표를 얻었습니다.
Felipe Alvarez

94

먼저 파일이 삭제 된 개정 번호를 찾으십시오.

svn log -v > log.txt

그런 다음 log.txt (SVN 전문가가 아니므로 더 나은 방법을 모르겠습니다)에서

D <deleted file>

어느 개정판인지 확인하십시오. 그런 다음 다른 답변에서와 같이 이전 개정을 사용하여 파일을 부활 시키십시오.


22
svn log -v | grep D "file.name"
abatishchev

18
질문에 올바르게 답변 한 첫 번째 사람이 +1입니다. 삭제하기 전에 개정판을 모르면 내용을 볼 수 없습니다.
Cerin

8
@abatishchev 이것은 삭제 된 파일 목록을 가져 오지만 개정 정보를 삭제하므로 유용하지 않습니다. 또한 변경 내역이 많은 크고 오래된 저장소로 작업하는 경우 속도가 느립니다.
tchen

4
@abatishchev의 개선으로 좋습니다. tchen : grep에 -B50 정도의 인수를 사용하여 쉽게 고쳤습니다. 내 대답을 참조하십시오.
Jonas Byström

2
매우 크거나 오래된 리포지토리에 대해 svn log -v 출력을 제한하는 또 다른 좋은 방법은 -l 옵션입니다. 따라서 svn log -v -l 100 | grep D "file.name"
mindmatters

27

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

이것은 실제로 파일을 개정 제어로 되 돌리는 것은 아닙니다. 최종 상태에 있던 파일을 현재 위치에 놓기 만하면됩니다. 그런 다음 추가하거나 검사하거나 그 시점에서 무엇이든 할 수 있습니다.


6
훌륭한 답변입니다. 문제는 svn에 관한 질문입니다!
JohnK

16

GUI 만 사용하는 솔루션 :

파일 이름을 알고 있지만 마지막 개정 번호 또는 경로를 모르는 경우 :

  1. Repo Browser에서 루트에 "로그 표시"를 수행하십시오.
  2. 로그 대화 상자의 맨 아래에있는 "모두 표시"를 누르십시오.
  3. 로그 대화 상자의 맨 위에있는 필터 텍스트 상자에 파일 이름을 입력하십시오.

그러면 파일이 추가 / 수정 / 삭제 된 개정판 만 표시됩니다. 이것은 파일의 역사입니다.

상위 폴더 중 하나를 삭제하여 파일을 삭제하면 로그에 '삭제 된'항목이 없으므로 mjy의 솔루션이 작동하지 않습니다. 이 경우 필터링 된 로그의 가장 최근 항목은 삭제시 해당 내용에 해당합니다.


무차별 대항은 항상 똥이 아닙니다. 특히 큰 repos에는 없습니다.
Jonas Byström

UI 전용 솔루션의 경우 +1 커맨드 라인은 훌륭하지만 전부 예외는 아니지만 항상 최선의 대답은 아닙니다. 특히 환경에서 작업 할 때는 제어 할 수 없으며 SVN에 대한 쉬운 명령 줄 액세스가 없습니다.
Mir

위의 답변은 TortoiseSVN GUI를위한 것입니다.
게오르그 e 렌 베르크

13
svn log -v | grep -B50 YourDeletedFileName

경로와 개정판을 제공합니다. git에서 (이름 바꾸기도 확인) :

git log --diff-filter=DR --name-only | grep -B50 YourDeletedFileName

-B50의 기능은 무엇입니까? svn log 및 grep을 사용하여 파일 목록을 얻을 수 있지만 여기의 팁을 사용하면 매우 쉽게 수정할 수 있지만 개정 번호가 다른 줄에 표시되는 것처럼 쉽게 표시되지 않는 것 같습니다. 나는 B50 일을 시도했지만 놀랍게도 효과가 없었습니다.
cedd

다른 사람이 이것을 읽고있는 경우 계산 된 줄과 위의 50 줄을 출력합니다.
cedd

8

Dustin의 답변 외에도 내용을 확인하고 확인하지 않으려는 경우 그의 예에서 다음을 수행 할 수 있습니다.

$ git show 8d4a1f^:slosh.tac

: : 개정과 해당 개정에서 경로를 분리하여 특정 개정에서 특정 경로를 효과적으로 요청합니다.


아, 정말이야 나는 그것을 정말로, 정말로 어려운 방법으로 사용했습니다. :)
Dustin

8

이 명령을 사용하십시오 :

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

패턴과 일치하는 파일을 삭제 한 모든 개정이 나열됩니다. 즉, 모든의 README 파일에 대한 당신이있는 거 검색, 경우 /src/README, /src/README.first/some/deeply/hidden/directory/READMENOT발견하고 나열됩니다.

파일 이름 에 슬래시 (경로), 점 또는 기타 특수 정규식 문자가 포함되어 있으면 불일치 나 오류를 피하기 위해 이스케이프를 잊지 마십시오.


7

삭제 된 파일의 경로를 모르면 너무 무거운 명령 으로 파일을 검색 할 수 있습니다 svn log.

svn log --search <deleted_file_or_pattern> -v

이 명령은 아마도 검색 옵션없이 서버를 망치게 할 것입니다. 그러나 적어도 관련 리소스 (안구 포함)는 파일이 어느 개정판에서 삭제되었는지 알려줄 것이므로 다소 완화 될 것입니다. 그런 다음 다른 팁을 따를 수 있습니다 (주로 동일한 svn log명령을 사용하지만 이미 정의 된 경로에 있음).


svn log --search _test2.php -v... svn : 유효하지 않은 옵션 : --search ... :(
thinsoldier

5

포스터는 실제로 여기에 3 가지 질문을했습니다.

  1. Subversion에서 삭제 된 파일의 기록을 보려면 어떻게합니까?
  2. Subversion에서 삭제 된 파일의 내용을 보려면 어떻게합니까?
  3. Subversion에서 삭제 된 파일을 어떻게 복원합니까?

여기에 보이는 모든 답변은 2 번과 3 번 문제에 대한 것입니다.

질문 1에 대한 답은 다음과 같습니다.

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

파일이 마지막으로 존재했을 때의 개정 번호를 가져와야합니다. 여기에서 다른 사람들이 명확하게 답변합니다.


4

아, Bazaar 사용법을 배우기 때문에 내가 시도한 것입니다. 성공하지 않으면 현재 제거 된 파일을 기록하고 주석을 달 수 없습니다 ... :-(

시도 :

> 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) 매개 변수를 조정하십시오 ).


1

수정본을 지정해야합니다.

svn log -r <revision> <deleted file>

1
오류가 발생합니다. 예 : svn log -r 37428 svn.example.com/deletedfile.java svn : '/!svn/bc/98571/deletedfile.java'경로를 찾을 수 없음
Jeremy

해당 개정판에 존재 했습니까? 파일이 실제로 존재하는 개정을 지정해야합니다.
Jack M.

-r37428과 @ 37428을 SVN URL에 추가하는 것의 이상한 차이점에 대해서는 Bert Huijben의 답변을 참조하십시오.
dubek


1

나는 대답을 원했다. 에서 삭제 만 출력하려면 다음을 시도하십시오 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 log출력 에서와 같이 ).

a --limit를 지정하여 반환되는 레코드 양을 줄일 수 있습니다 . --stop-on-copy필요에 따라를 제거 할 수도 있습니다 .

전체 로그를 구문 분석하는 효율성에 대한 불만이 있음을 알고 있습니다. 나는 이것이 grep과 "광범위한 캐스트" -B옵션 보다 더 나은 해결책이라고 생각합니다 . 더 효율적인지 모르겠지만에 대한 대안을 생각할 수 없습니다 svn log. @Alexander Amelkin의 답변과 비슷하지만 특정 이름이 필요하지 않습니다. 또한 첫 번째 awk 스크립트 이기도 하므로 기존과 다를 수 있습니다.


1

파일 이름이 ~ / src / a / b / c / deleted.file이라고 가정합니다.

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 .

0

이진 검색을 사용하여 파일을 제공하는 마지막 개정판을 찾을 수 있습니다. 이를 위해 간단한 /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"
}

-1

모든 리포지토리의 svn 로그를 mysql 데이터베이스에 복사하는 PHP 스크립트를 작성했습니다. 내 의견이나 파일 이름을 전체 텍스트로 검색 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.