답변:
원격 지점을 수동으로 추가 할 수 있습니다.
git config --add svn-remote.newbranch.url https://svn/path_to_newbranch/
git config --add svn-remote.newbranch.fetch :refs/remotes/newbranch
git svn fetch newbranch [-r<rev>]
git checkout -b local-newbranch -t newbranch
git svn rebase newbranch
fatal: Cannot setup tracking information; starting point 'newbranch' is not a branch.
git checkout 단계에 도달 했습니다.
모든 원격 svn 분기를 추적하려는 경우 솔루션은 다음과 같이 간단합니다.
git svn fetch
아직 가져 오지 않은 모든 원격 브랜치를 가져옵니다.
추가 팁 : 처음에 트렁크 만 체크 아웃 한 다음 나중에 모든 분기를 추적 .git/config
하려면 다음과 같이 편집 하고 다시 실행하십시오 git svn fetch
.
[svn-remote "svn"]
url = https://svn/path_to_repo_root/
fetch = path_to_trunk:refs/remotes/git-svn
branches = path_to_branches/*:refs/remotes/*
요점은 url
리포지토리 루트를 가리켜 야하며에 정의 된 경로 fetch
와 branches
상대 경로 여야합니다 url
.
ALL 대신 특정 분기 만 가져 오려면 다음과 같은 좋은 예가 있습니다 git svn --help
.
[svn-remote "huge-project"]
url = http://server.org/svn
fetch = trunk/src:refs/remotes/trunk
branches = branches/{red,green}/src:refs/remotes/branches/*
tags = tags/{1.0,2.0}/src:refs/remotes/tags/*
의 이전 버전에서는 이와 git-svn
같이 분기를 지정하면으로 새 분기를 얻지 못할 수 있습니다 git svn fetch
. 한 가지 해결 방법은 fetch
다음과 같이 줄을 추가하는 것입니다 .
[svn-remote "huge-project"]
url = http://server.org/svn
fetch = trunk/src:refs/remotes/trunk
fetch = branches/blue:refs/remotes/branches/blue
fetch = branches/yellow:refs/remotes/branches/yellow
branches = branches/{red,green}/src:refs/remotes/branches/*
@AndyEstes의 또 다른 해결 방법 : 새로 지정한 분기 또는 태그를 만들기 전에 .git/svn/.metadata
값을 수정 branches-maxRev
하거나 tags-maxRev
수정합니다. 이 작업을 완료 git svn fetch
하면 새로운 svn 원격 분기를 추적하도록 실행 하십시오.
.git/svn/.metadata
이 매우 도움이되었습니다! 내에서 별도의 지점 추가 된 .git/config
, git svn fetch
메타 데이터 버전 번호는 "너무 멀리 앞서"때문에 -에 선택하지 않았다입니다. 어떤 경우에는 지점에서 마지막 커밋 만 가져 왔습니다. 내가 수동으로 (이름 결함이있는 지점의 없앴다고 .git/svn/refs/remotes/svn/qa/XYZ
에 .git/svn/refs/remotes/svn/qa/XYZ~
, 그것의 존재를 떨어 .git/packed-refs
등) ... 메타 데이터에 대한 "이전"개정 번호를 포착 ... 실행 된 git svn fetch
마지막 w / 수정, 연결된 그래프 전체 역사를 얻을 수 있습니다.
git svn fetch --all
.
방금 필요한 것 같습니다 git svn fetch
. 어떻게 든 변경 사항 대신 전체 저장소를 가져올 것이라고 스스로 확신했습니다.
어쩌면 나는 어쨌든 그것을 엉망으로 만들었지 만 vjangus의 답변에있는 지침을 따르고 거의 효과가있었습니다. 유일한 문제는 뉴 브랜치가 트렁크에서 분기되지 않은 것입니다. gitk에서, 그것은 스스로 "떠 다니는"종류였다. 트렁크와 공통 조상이 없었습니다.
이에 대한 해결책은 다음과 같습니다.
git diff-tree <sha1 from step 1> <sha1 from step 2>
-출력이 없어야합니다. 출력이 있으면 잘못된 커밋을 선택했을 수 있습니다.git checkout local-newbranch
그때 git rebase <sha1 from step 1>
. local-newbranch
새 트리로 리베이스 되지만 remotes/newbranch
여전히 연결이 끊어집니다..git/refs/remotes/newbranch
의 전체 SHA1 (rebased에 있음 ) 을 포함하도록 편집하십시오 . (또는 어쩌면 사용하십시오 . 감사합니다.)newbranch
git-update-ref refs/remotes/newbranch <new-SHA>
git svn dcommit
할 newbranch
, 당신은 몇 가지 로그를 업데이트 그것에 대해 메시지의 무리를 얻을 수 있습니다. 이것은 정상적인 것입니다.gitk --all
하루 종일 열어 두고 자주 새로 고쳐서 수행중인 작업을 추적하는 것이 좋습니다. 나는 여전히 git 및 git svn을 처음 사용 하므로이 방법의 개선을 제안하십시오.
vjangus의 답변 단순화 :
SVN에서 표준 레이아웃을 사용하고 일반적인 svn init을 수행했다면 git-svn이 구성 작업을 수행합니다. 다만:
예입니다. SVN URL은 svn+ssh://gil@svn.myplace.com/repo
입니다. 내가 찾고있는 SVN 지점은 newbranch
입니다. 로컬 자식 브랜치 (트래킹 원격 newbranch
)가됩니다 git-newbranch
.
1 단계 : 분기 복사 개정판 찾기
# svn log --stop-on-copy svn + ssh : //gil@svn.myplace.com/repo/branches/newbranch | 꼬리 -4 r7802 | 누군가 | 2014-03-21 18:54:58 +0000 (2014 년 3 월 21 일 금요일) | 1 줄 HEAD를 새 가지로 분기 -------------------------------------------------- ----------------------
SVN의 분기점은 개정 7802입니다.
2 단계 : 개정판 가져 오기
# 자식 svn 가져 오기 -r 7802 가능한 분기점을 찾았습니다. svn + ssh : //gil@svn.myplace.com/repo/trunk => svn + ssh : //gil@svn.myplace.com/repo/branches/newbranch, 7801 찾은 분기 상위 : (참조 / 원격 / 트렁크) 8dcf3c5793ff1a8a79dc94d268c91c2bf388894a do_switch가있는 다음 부모 부모님을 성공적으로 따름 r7802 = 9bbd4194041675ca5c9c6f3917e05ca5654a8a1e (refs / remotes / newbranch)
git-svn은 모든 작업을 수행했으며 이제 원격에 대해 알고 있습니다.
# git show-ref | Grep Newbranch 2df23af4733f36f5ad3c14cc1fa582ceeb3edb5c refs / remotes / newbranch
3 단계 : 원격 지점을 추적하는 새 로컬 지점을 만듭니다.
# git checkout -b git-newbranch -t newbranch 파일 체크 아웃 : 100 % (413/413) 완료 지점 git-newbranch는 로컬 심판 심판 / 원격 / newbranch를 추적하도록 설정되었습니다. 새로운 분기 'git-newbranch'로 전환
show-ref
. 원격 지사를 잘못 참조하는 사람이라면 누구든지 삭제할 수 있습니다 (필자는 git branch -d newbranch
ref 디렉토리를 강제로 제거 한 다음 강제로 제거해야합니다 .git/svn/refs/remotes/newbranch
).
이 기능에 대한 문서를 찾지 못했지만 git svn 구성이 여러 페치 항목을 지원하는 것처럼 보입니다. 이 방법으로 구성에 다른 원격 svn 저장소 항목을 추가하거나 와일드 카드를 사용하여 특정 디렉토리의 모든 분기를 가져올 필요없이 분기를 별도로 추가 할 수도 있습니다.
SVN 트리가 더 많은 분기를 포함하는 분기 및 하위 디렉토리를 갖는 등의 위치에 논리가없는 많은 분기가 실제로 불쾌하다고 가정하십시오.
즉
trunk
branches
-> branch1
-> sub-dir1
-> branch2
-> branch3
-> sub-dir2
-> branch4
-> sub-dir3
-> branchX
<... hundreds more ...>
git 저장소에 포함시킬 브랜치 중 일부를 직접 선택하고 싶습니다.
먼저 추가 분기없이 트렁크만으로 저장소를 초기화 할 수 있습니다.
git svn clone -r 10000:HEAD https://svn.com/MyRepo myrepo --prefix=svn/ --trunk=trunk
그 후에 다음과 같은 구성이 나타납니다.
localhost: elhigu$ git config --get-regexp "svn-remote."
svn-remote.svn.url https://svn.com/MyRepo
svn-remote.svn.fetch trunk:refs/remotes/svn/trunk
MyRepo에서 새 브랜치를 가져 오려면 다음을 수행하여 구성에 새 페치 항목을 추가하면됩니다.
git config --add svn-remote.svn.fetch branches/sub-dir2/branch4:refs/remotes/svn/branches/sub-dir2/branch4
또는 .git / config에서 동일한 구성을 편집 할 수 있습니다
구성에 새 분기를 추가 한 후 새 분기를 가져 오려면 다음을 실행하십시오.
git svn fetch -r 10000:HEAD
[편집] 때때로 새로 추가 된 브랜치를 가져 오기 위해 --all 매개 변수와 함께 fetch를 실행해야 할 때가 있습니다.
git svn fetch --all -r 10000:HEAD
git-svn quirks 를 처리하는 대신 SubGit을 사용해보십시오 .
SubGit을 Subversion 저장소에 설치해야합니다. 그 후 특별한 git-svn 명령을 사용하는 대신 표준 git workflow를 사용할 수 있습니다.
새로운 커밋 추진 :
git-svn :
$ git commit
$ git svn rebase
$ git svn dcommit
서브 깃 :
$ git commit
$ git push
수신 변경 사항 가져 오기
git-svn :
$ git svn rebase
서브 깃 :
$ git pull [--rebase]
새로운 지점 만들기 :
git-svn :
$ git svn branch foo
$ git checkout -b foo -t remotes/foo
$ git commit
$ git svn dcommit
서브 깃 :
$ git checkout -b foo
$ git commit
$ git push
자세한 내용은 SubGit 설명서 를 참조하십시오.
vjangus의 답변에 추가하기 위해 git grafts를 사용하여 분기를 트렁크에 적절한 지점에 묶는 것이 유용하다는 것을 알았습니다 .git이 역사를보고 병합을 올바르게 수행 할 수있게했습니다.
이것은 단순히 .git/info/grafts
해시 로 라인을 추가하는 경우입니다 .
<initial branch commit> <parent commit in trunk>
예.
378b0ae0902f5c2d2ba230c429a47698810532e5 6c7144991381ce347d4e563e9912465700be0638
http://evan-tech.livejournal.com/255341.html에 크레딧
(이 의견을 의견으로 추가하지만 평판이 충분하지 않습니다.)