Google Code Subversion 저장소를 GitHub에 포크 및 동기화


131

GitHub 리포지토리에 대한 쓰기 액세스 권한이없는 Google Code Subversion 리포지토리와 포크 및 동기화를 유지하려면 어떻게해야합니까?

Git 리포지토리에서 자체 기능을 개발하고 싶지만 Google Code Subversion 리포지토리와 동기화하고 싶습니다. Google 코드 프로젝트 측에서 수정 사항을 가져옵니다.

git-svn에 대해 알고 있으며 내가 완전히 제어 할 수있는 Subversion 저장소로 업스트림 및 다운 스트림하기 전에 사용했습니다. 그러나 Google Code Subversion 저장소와 동기화하는 방법을 모르겠습니다.

답변:


178

git-svn의 원격 브랜치는 일반 Git 원격과 거의 같습니다. 따라서 로컬 리포지토리에서 git-svn 복제본을 만들고 변경 사항을 GitHub에 푸시 할 수 있습니다. Git은 상관하지 않습니다. git-svn 클론을 생성하고 똑같은 변경 사항을 GitHub에 푸시하면 비공식 Google 코드 저장소 미러가 생깁니다. 나머지는 바닐라 힘입니다.

git svn clone http://example.googlecode.com/svn -s
git remote add origin git@github.com:example/example.git
git push origin master

이제 이것을 가지고 있으면 때때로 Subversion 저장소를 Git과 동기화해야합니다. 다음과 같이 보일 것입니다 :

git svn rebase
git push

gitk 또는 무엇이든, 이것은 다음과 같이 보일 것입니다 :

o [master][remotes/trunk][remotes/origin/master]
|
o
|
o

그리고 당신이 실행할 때 git svn rebase, 당신은 이것을 가질 것입니다 :

o [master][remotes/trunk]
|
o
|
o [remotes/origin/master]
|
o
|
o

이제 실행 git push하면 해당 커밋이 [원격 / 원점 / 마스터] 지점 인 GitHub로 푸시 됩니다. 그리고 첫 번째 ASCII 아트 다이어그램의 시나리오로 돌아갑니다.

이제 문제는 믹스에서 변경 사항을 어떻게 처리합니까? 아이디어는 git-svn-rebase-ing 및 git-pushing과 동일한 브랜치에 커밋하지 않는 것입니다. 변경을 위해 별도의 지점이 필요합니다. 그렇지 않으면 Subversion의 변경 사항을 기반으로 변경 사항을 다시 작성하여 Git 저장소를 복제하는 사람을 화나게 할 수 있습니다. 날 따라와? 자, 브랜치를 생성하고 "기능"이라고 부르겠습니다. 그리고 커밋을 만들고 기능 분기의 GitHub로 푸시합니다. 당신의 gitk는 다음과 같이 보일 것입니다 :

o [features][remotes/origin/features]
|
o
|
o [master][remotes/trunk][remotes/origin/master]
|
o

여기에 기능 분기에 Google 코드 분기보다 몇 가지 커밋이 있습니다. Google 코드에서 새로운 것을 통합하고 싶을 때 어떻게됩니까? git svn rebase먼저 실행 하고 이것을 얻으십시오.

                           o [features][remotes/origin/features]
[master][remotes/trunk] o  |
                        |  o
                        o /
                        |/
                        o[remotes/origin/master]
                        |
                        o

당신이 경우 git push밖으로 마스터, 당신이 상상할 수있는 [리모컨 / 원산지 / 마스터] 마스터와 동일 시점에서 인. 그러나 기능 분기에는 변경 사항이 없습니다. 이제 마스터를 기능으로 병합하거나 기능을 리베이스 할 수 있습니다. 병합은 다음과 같습니다

git checkout features
git merge master 

            o [features]
           /|
          / o [remotes/origin/features]
[master] o  |
         |  o
         o /
         |/
         o
         |
         o

그런 다음 기능을 GitHub로 푸시합니다. 마스터가 공간을 절약하기 위해 리모컨을 사용하지 않았습니다 . [master] 와 같은 시점에 있습니다.

리베이스 접근 방식은 약간 더 악합니다. 푸시가 빨리 병합되지 않기 때문에 --force로 푸시해야합니다 (복제 한 사람 아래에서 기능 분기를 가져옵니다). 이 작업을 수행해도 괜찮다고 생각되지는 않지만 결정된 사람은 아무도 막을 수 없습니다. 패치가 약간 재 작업 된 형태로 업스트림에 승인 될 때와 같이 일부 작업도 더 쉬워집니다. 충돌로 인한 혼란을 막기 위해 업스트림 패치를 건너 뛰면됩니다. 어쨌든 rebase는 다음과 같습니다.

git rebase master features

         o [features]
         |
         o
         |  o [remotes/origin/features]
[master] o  |
         |  o
         o /
         |/
         o
         |
         o

그리고 당신은 git push --force그것을 해야 할 것 입니다. 당신은 왜 그것을 강요해야하는지 알 수 있습니다. 역사는 [원격 / 원산지 / 특징] 에서 새로운 현재 사후 후행 [특징]에 이르기까지 큰 오래된 분열을 가지고 있습니다 .

이 모든 것이 작동하지만 많은 노력이 필요합니다. 정기적으로 기고자가 되려면, 이렇게하는 것이 가장 좋은 방법이며, 패치를 업스트림으로 보내고 Subversion에 대한 커밋 액세스 권한이 있는지 확인하십시오. 실패하면 아마도 변경 사항을 GitHub로 푸시하지 마십시오. 지역을 유지하고 어쨌든 상류로 수용하도록하십시오.


훌륭한 지침에 감사드립니다. ( git멍청한 놈) 빠른 질문. 큰 SVN 저장소에 대해이 작업을 수행했으며 ~ 141MB로 나왔습니다. 나는 그것을 github에 푸시 한 다음 다시 복제하여 130MB로 나왔다. 나는 git gc둘 다 달렸다 . 차이점을 설명 할 수있는 것은 무엇입니까?
mpontillo

... 알아 냈습니다. 나는 필요했다 git push origin --mirror.
mpontillo


에 대한 -s옵션 으로는 작동하지 않았지만 git svn clone나머지 옵션 은 제대로 작동 했습니다.
user1027169

15

svn2github 서비스

웹 사이트 http://svn2github.com/ 은 공개적으로 액세스 가능한 SVN 저장소를 Github ( https://github.com/svn2github/projectname ) 에 포크하는 서비스를 제공합니다 . 나는 그것을 시도했다; "미러 만들기"를 누르면 몇 초 동안 아무 것도하지 않았으며 "오류"메시지가 표시되었지만 실제로 작동했습니다. SVN 저장소의 코드를 포함하는 새로운 저장소가 실제로 작성되었습니다.

그런 다음 작성하는 저장소를 포크하고 자신의 포크로 작업합니다. 그런 다음 버그 추적기를 사용하여 업스트림 프로젝트에 변경 사항을 제출하십시오.

서비스의 Github 사용자 (예 : "svn2github가 5 시간 전 svn2github / haxe에서 마스터로 푸시 됨")에서 기존 리포지토리를 보면 SVN 리포지토리에서 정기적으로 변경 사항을 가져 오는 것 같습니다. 웹 사이트에서 서비스를 실행하는 사람에 대한 정보는 없으므로 계속 무기한으로 실행되는 것이 아니라 지금 작동합니다 (그리고 다운 된 경우에도 수동으로 포크를 업데이트 할 수 있음).

발사대

Git 및 Github을 사용하도록 설정하지 않은 경우 다른 대안은 Launchpad.net을 사용하는 것입니다. 런치 패드는 SVN (또한 CVS) 저장소를 개인 bzr 분기로 자동으로 가져올 수 있습니다. 이렇게하려면 런치 패드 프로젝트를 작성한 후 새 가져 오기 페이지 로 이동하여 Subversion을 선택하고 URL (예 :)을 입력하십시오 http://projectname.googlecode.com/svn/trunk/. 프로젝트 크기에 따라 초기 가져 오기에는 최대 몇 시간이 걸릴 수 있습니다. 후속 가져 오기는 정기적으로 실행됩니다.

자세한 내용 은 런치 패드 도움말에서 VCS 가져 오기를 참조하십시오 .


10

Google 코드에서 GitHub로 동기화하는 방법은 fnokd.com 에서 확인할 수 있습니다 . 저자는 상시 가동 원격 서버와 크론 작업을 사용하여 동기화를 자동화하고 SVN 트렁크를 "공급 업체"라는 GitHub 지점에 유지합니다.


2

GitHub는 이제 서브 버전 프로젝트를 직접 가져 오는 것을 지원합니다 ( http://help.github.com/import-from-subversion/ 참조 ). 새 저장소를 만든 다음 "다음 단계"화면에서 "Subversion에서 가져 오기"를 클릭하십시오. : /는 더 이상 동기화를 지원하지 않습니다.


이 방법은 더 이상 존재하지 않습니다
magnetik


1

흠 .. 내 회사에서 나는 거의 똑같이하고 있었다. 동일한 디렉토리에 .svn 및 .git repo가 ​​모두 있습니다 (svn repo를 체크 아웃 하고이 작업 사본에서 git repo를 작성하십시오).

그런 다음 svn up 및 git push를 사용하여 작업을 수행했습니다. 물론 당신이 많이 분기한다면 손으로 물건을 합쳐야합니다.


Ja 맞다.하지만 .svn 메타 데이터를 피하고 git이 svn repos를 다운 스트림 마스터로 사용할 수 있기를 바랐다
optixx

그래서 git-svn을 사용하여 repo를 체크 아웃하고 git push를 github에 사용할 수 없습니까?
Marcin Gil

0

나는 당신이 원하는 것이 무엇인지 확실하지 않지만 물론 Subversion 저장소에서 가져 와서 동일한 작업 사본에서 Git 저장소로 푸시 할 수 있습니다. 또한 git svn dcommit서브 버전 저장소로 돌아갈 수도 있습니다 . 그래도 GitHub 리포지토리를 서브 버전 리포지토리와 동기화 할 수 없습니다. 또한 작업 복사본에 아직 서브 버전 저장소에없는 커밋이있는 경우 서브 버전 저장소가 업데이트 된 경우이를 리베이스해야 git push --force하므로 GitHub 에 대한 "새"커밋이 필요합니다.


0

Yu-Jie Lin 의 블로그 에서 다음 지침을 찾았습니다 .

먼저 Subversion 저장소를 복제하고 Git으로 푸시하십시오.

git svn clone https://foo.googlecode.com/svn/ git-foo 
cd git-foo
git remote add git-foo git@github.com:username/foo.git 
git push git-foo master

Subversion 저장소에서 커밋 한 후 다음을 실행하십시오.

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