2017-12-02 24 views
1

SVN 개정 ID를 기반으로 한 커밋의 로컬 해시를 얻으려는 경우, 보통 git svn find-rev을 실행합니다. 그러나이 명령은 현재 분기 나 개정 후에 명령에 명시 적으로 지정된 분기에서만 커밋을 찾습니다.`git svn find-rev`가 전체 저장소를 검색합니다.

때로는 개정 ID 만 알고 있으며 분기 이름을 모른 채 로컬 해시를 찾고 싶습니다. git svn find-rev으로 해결할 수 있습니까? SVN 수정본이 고유하다는 것을 알고 있으면 의미가 있습니다.

편집 :

이 밝혀 그것을 할 수있는 좋은 방법이 없습니다. 해결책을 제공하는 답변을 수락했으나 광산과 같이 많은 수의 지사가있는 저장소를 검색하는 데 너무 오래 걸립니다. 난 내 자신의 쉘 함수를 작성하고 훨씬 빠르게 작동하는 git svn와 함께 정기적 svn를 사용하여 종료 :

gitrev() 
{ 
    if [ -z "$1" ]; then 
    echo "${FUNCNAME[0]} <revision> [git_args]" 
    return 1 
    fi 
    local rev b 
    rev="$1" 
    shift 
    b="$(svn log -v -c "$rev" "$SVN_BRANCHES_URL" | grep -m1 -Po '/branches/\K[^/]+')" && 
    git svn find-rev "r${rev#r}" "origin/$b" "[email protected]" 
} 

당신이 그것을 사용하는 경우 GNU에하지 않으면, 당신은 grep -P 부품을 교체해야 할 수도 있습니다/리눅스. 개정은 "r"접 두부와 함께 또는없이 지정할 수 있습니다.

답변

1

당신이 전자 수있는 모든 지역 지점에서 검색 할 수 있습니다. 지.

git for-each-ref --format='%(refname)' refs/heads/ | xargs -l git svn find-rev r123456 

가 더 신뢰할하지만 여전히 빠르고, 당신은 조금으로, 중단 후 전자 일치하는 항목이 발견 될 때까지 모든 심판을보고 더 복잡한 선을 그것을 할 수 있습니다 위해 않습니다. 지. like

while read ref; do result="$(git svn find-rev r123456 "$ref")"; [ -n "$result" ] && echo $result && break; done < <(git for-each-ref --format='%(refname)') 
+0

내 경우에는 원격 지점도 검색해야하지만 시간이 많이 걸립니다. – Thunderbeef

+0

예, 꽤 많은 시간을 필요로 할 수 있습니다. 특히 많은 수의 참조가 있고 e. 지. 모든 심판을주고 개정판이 여러 지점 또는 일부 지점과 일부 태그에있는 경우 여러 번 결과를 얻을 수 있습니다. 그러나 그것이 내가 아는 유일한 짧은 길입니다. 그렇지 않으면 기본적으로 동일한 작업을 수행하고 결과를 찾은 즉시 중지해야합니다. – Vampire

+0

좋아, 나는 전체 저장소에서 안정적으로 작동하고 뭔가 발견 되 자마자 멈출 수있는 또 다른 하나의 라이너를 게시했습니다. e에 정렬을 추가하여 조금 수정할 수 있습니다. 지. 먼저 로컬 브랜치를 살펴본 다음 원격 브랜치를 살펴본 다음 태그 나 그와 비슷한 것을 참조하십시오. – Vampire

0

git svn find-rev은 현재 분기의 sha-1 값을 보여줍니다. 하지만 쉘 스크립트를 사용하여 전체 repo에서 커밋을 검색 할 수 있습니다.

이러한 당신이 개정 r9에서 커밋 대응을 원한다면으로, 당신은 아래 r9로 변수 rev 값을 지정할 수 있습니다

#!/bin/sh 

rev="r9" 
for branch in $(git branch -r) 
do 
{ 
    git checkout $branch 
    sha=$(git svn find-rev $rev) 
    if [ ! -z "$sha" ]; then 
    { 
    echo "The revision $rev has the corresponding commit is $sha. And the commit is on $branch branch." 
    break 
    } 
    fi 
} 
done