programing

repo를 가져온 후 생성된 원격 분기에 대해 git-svn에 어떻게 알립니까?

subpage 2023. 7. 8. 10:53
반응형

repo를 가져온 후 생성된 원격 분기에 대해 git-svn에 어떻게 알립니까?

는 중용사를 합니다.git-svn회사의 중앙 서브버전 저장소를 상대로 작업합니다.최근에 중앙 저장소에 새 피쳐 분기를 만들었습니다.

어떻게 Git에게 그것에 대해 말합니까?가 행할때실을 할 때.git branch -r실행할 때 존재했던 가지만 보입니다.fetch내 Gitrepo를 초기화하기 위해 Subversion repo에 대항하는 것?

원격 분기를 수동으로 추가할 수 있습니다.

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

모든 원격 svn 분기를 추적하려는 경우 솔루션은 다음과 같이 간단합니다.

git svn fetch

아직 가져오지 않은 모든 원격 분기를 가져옵니다.

추가 팁: 처음에는 트렁크만 체크아웃하고 나중에 모든 분기를 추적하려면 편집.git/config 이게보다것달리는시이고렇것run-▁to▁look달는리▁re다▁and.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 fetch어떻게든 저는 단지 변화가 아닌 전체 레포를 가져올 것이라고 스스로 확신했습니다.

내가 어떻게든 망친 것 같은데 vjangus의 답변에 있는 지시사항을 따랐더니 거의 효과가 있었습니다.유일한 문제는 새로운 지점이 트렁크에서 분기된 것 같지 않다는 것입니다.Gitk에서, 그것은 일종의 "떠다니는" 것이었습니다; 그것은 트렁크와 공통 조상이 없었습니다.

이에 대한 솔루션은 다음과 같습니다.

  1. 분기가 생성되기 전 트렁크에서 발생한 마지막 커밋의 SHA1을 찾습니다.
  2. 새 분기에서 첫 번째 커밋의 SHA1을 찾습니다(아마도 메시지는 "Create new branch, copyed from trunk@12345" 등).
  3. git diff-tree <sha1 from step 1> <sha1 from step 2>출력이 없어야 합니다.출력이 있으면 커밋을 잘못 선택했을 수 있습니다.
  4. git checkout local-newbranch그리고나서git rebase <sha1 from step 1>기본값이 변경됩니다.local-newbranch 위에 새나무 에위그러나▁but▁the.remotes/newbranch연결이 계속 끊어집니다.
  5. 로 합니다..git/refs/remotes/newbranch 커밋의 전체 SHA1을 포함하도록 편집(리베이스)newbranch ( 사용할 도 있습니다.)git-update-ref refs/remotes/newbranch <new-SHA>감사합니다.)
  6. 다음에 당신이git svn dcommitnewbranch로그를 업데이트한다는 내용의 메시지가 많이 표시됩니다.제 생각엔 이게 정상인 것 같아요.

▁recommend▁keeping▁i합보를 유지하는 것을 추천합니다.gitk --all항상 열고 자주 새로 고쳐야 하는 작업을 추적할 수 있습니다.저는 아직 git과 gitsvn에 익숙하지 않아서 이 방법의 개선점을 제안해주세요.

vjangus의 답변 단순화:

SVN에서 표준 레이아웃을 사용하고 있고 일반적인 svn init을 수행한 경우 git-svn이 구성 작업을 수행합니다.정당:

  1. SVN에서 분기 복사본 리비전 찾기
  2. git-svn을 사용하여 해당 개정판 가져오기
  3. 새 로컬 분기 추적 원격 만들기

은 "SVN url"svn+ssh://gil@svn.myplace.com/repo제가 있는 은 SVN 지점입니다.newbranch 분기 컬로원분기추격적원iting분▁(기)(추▁local적격로tracknewbranch) 될 것입니다.git-newbranch.

1단계: 분기-복사본 개정판 찾기

svn log --stop-on-copy svn+copy://gil@svn.myplace.com /repo/cisco/newbranch | tail -4r7802 | 누군가 | 2014-03-21 18:54:58 +0000 (2014년 3월 21일 금요일) | 1줄
분기 HEAD를 새 분기로------------------------------------------------------------------------

따라서 SVN의 분기점은 개정 7802입니다.

2단계: 수정본 가져오기

git svn fetch -r 7802가능한 지점 발견: svn+branch://gil@svn.myplace.com /repo/repo=> svn+branch://gil@svn.myplace.com /repo/repo/newbranch, 7801발견된 분기 상위: (refs/remote/trunk) 8dcf3c5793ff1a8a79dc94d268c91c2bf388894ado_switch를 사용하여 상위 항목을 따릅니다.상위 항목을 성공적으로 팔로우했습니다.r7802 = 9bbd4194041675ca5c9c6f3917e05ca5654a8a1e (refs/remote/신규지점)

git-knn은 모든 작업을 수행했고 이제 원격에 대해 알고 있습니다.

git show-ref | grep 새 지점2df23af4733f36f5ad3c14cc1fa582ceb3edb5cref/원격/새 지점

3단계: 원격 지점을 추적하는 새 로컬 지점을 만듭니다.

git checkout - bit-new branch - t new branch파일 체크아웃: 100%(413/413) 완료.
분기 git - 로컬 참조/원격/새 분기를 추적하기 위해 설정된 새 분기.
새 지점 'git-new 지점'으로 전환

이 기능에 대한 설명서를 찾지 못했지만 gitsvn 구성이 여러 개의 가져오기 항목을 지원하는 것 같습니다.이렇게 하면 구성에 다른 원격 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 퀘이크를 처리하는 대신 SubGit을 사용할 수 있습니다.

SubGit를 Subversion 저장소에 설치해야 합니다.그런 다음 특수 git-svn 명령을 사용하는 대신 표준 git 워크플로우를 사용할 수 있습니다.

  1. 새 커밋 푸시:

    git-signn:

    $ git commit
    $ git svn rebase
    $ git svn dcommit
    

    SubGit:

    $ git commit
    $ git push
    
  2. 들어오는 변경 내용을 가져오는 중

    git-signn:

    $ git svn rebase
    

    SubGit:

    $ git pull [--rebase]
    
  3. 새 분기 만들기:

    git-signn:

    $ git svn branch foo
    $ git checkout -b foo -t remotes/foo
    $ git commit
    $ git svn dcommit
    

    SubGit:

    $ git checkout -b foo
    $ git commit
    $ git push
    

자세한 내용은 SubGit 설명서를 참조하십시오.

도움이 된 vjangus의 답변을 덧붙이자면, 적절한 지점에서 가지를 트렁크에 묶는 깃 그래프를 추가하는 것이 유용하다는 것을 알게 되었습니다. 깃 그래프를 사용하여 깃 그래프를 사용하면 깃이 기록을 보고 병합을 올바르게 수행할 수 있습니다.

이것은 단순히 다음에 줄을 추가하는 경우입니다..git/info/grafts해시와 함께:

<initial branch commit> <parent commit in trunk>

예를 들면

378b0ae0902f5c2d2ba230c429a47698810532e5 6c7144991381ce347d4e563e9912465700be0638

http://evan-tech.livejournal.com/255341.html 에 크레딧 추가

(저는 이것을 논평으로 추가하고 싶지만, 저는 충분한 평판을 가지고 있지 않습니다.

유효한 레이아웃으로 체크아웃하지 않으면 원격 지점을 체크아웃할 수 없습니다.

제가 하는 일은 다음과 같습니다.

git svn init -s <svn path with no trunk> local_repo
cd local_repo
git svn fetch 
## wait

그런 다음 원격 분기로 전환할 수 있습니다.

git checkout --track -b branch_name branch_name

그러면 자동으로 지점으로 전환됩니다.

언급URL : https://stackoverflow.com/questions/296975/how-do-i-tell-git-svn-about-a-remote-branch-created-after-i-fetched-the-repo

반응형