답변:
삭제 된 파일의 로그를 얻으려면
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'을 사용하지 마십시오!
오래된 파일을보고 싶을 때 실제로 다음과 같은 차이점을 알아야합니다.
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
./local/file
때 해결할 수 없을 때 오류를 냈기 때문에 절대 경로를 사용하지 않으면 여전히 실패했습니다 ./local
. SVN의 최신 버전에서는 문제가되지 않을 수 있습니다.
^
표기법이 편리합니다. 저장소 루트를 참조하므로 svn cat ^/local/file@REV
저장소 루트와 URL 사이의 거리에 따라 말할 수 있습니다 .
svn: E200009: Could not cat all targets because some targets are directories
먼저 파일이 삭제 된 개정 번호를 찾으십시오.
svn log -v > log.txt
그런 다음 log.txt (SVN 전문가가 아니므로 더 나은 방법을 모르겠습니다)에서
D <deleted file>
어느 개정판인지 확인하십시오. 그런 다음 다른 답변에서와 같이 이전 개정을 사용하여 파일을 부활 시키십시오.
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
이것은 실제로 파일을 개정 제어로 되 돌리는 것은 아닙니다. 최종 상태에 있던 파일을 현재 위치에 놓기 만하면됩니다. 그런 다음 추가하거나 검사하거나 그 시점에서 무엇이든 할 수 있습니다.
GUI 만 사용하는 솔루션 :
파일 이름을 알고 있지만 마지막 개정 번호 또는 경로를 모르는 경우 :
그러면 파일이 추가 / 수정 / 삭제 된 개정판 만 표시됩니다. 이것은 파일의 역사입니다.
상위 폴더 중 하나를 삭제하여 파일을 삭제하면 로그에 '삭제 된'항목이 없으므로 mjy의 솔루션이 작동하지 않습니다. 이 경우 필터링 된 로그의 가장 최근 항목은 삭제시 해당 내용에 해당합니다.
svn log -v | grep -B50 YourDeletedFileName
경로와 개정판을 제공합니다. git에서 (이름 바꾸기도 확인) :
git log --diff-filter=DR --name-only | grep -B50 YourDeletedFileName
이 명령을 사용하십시오 :
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
발견하고 나열됩니다.
파일 이름 에 슬래시 (경로), 점 또는 기타 특수 정규식 문자가 포함되어 있으면 불일치 나 오류를 피하기 위해 이스케이프를 잊지 마십시오.
삭제 된 파일의 경로를 모르면 너무 무거운 명령 으로 파일을 검색 할 수 있습니다 svn log
.
svn log --search <deleted_file_or_pattern> -v
이 명령은 아마도 검색 옵션없이 서버를 망치게 할 것입니다. 그러나 적어도 관련 리소스 (안구 포함)는 파일이 어느 개정판에서 삭제되었는지 알려줄 것이므로 다소 완화 될 것입니다. 그런 다음 다른 팁을 따를 수 있습니다 (주로 동일한 svn log
명령을 사용하지만 이미 정의 된 경로에 있음).
svn log --search _test2.php -v
... svn : 유효하지 않은 옵션 : --search ... :(
포스터는 실제로 여기에 3 가지 질문을했습니다.
여기에 보이는 모든 답변은 2 번과 3 번 문제에 대한 것입니다.
질문 1에 대한 답은 다음과 같습니다.
svn log http://server/svn/project/file@1234
파일이 마지막으로 존재했을 때의 개정 번호를 가져와야합니다. 여기에서 다른 사람들이 명확하게 답변합니다.
아, 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
) 매개 변수를 조정하십시오 ).
수정본을 지정해야합니다.
svn log -r <revision> <deleted file>
나는 대답을 원했다. 에서 삭제 만 출력하려면 다음을 시도하십시오 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 스크립트 이기도 하므로 기존과 다를 수 있습니다.
파일 이름이 ~ / 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 .
이진 검색을 사용하여 파일을 제공하는 마지막 개정판을 찾을 수 있습니다. 이를 위해 간단한 /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"
}