동일한 SVN 저장소의 다른 Git-SVN 클론이 GIT SVN DCOMMIT를 공유 할 수있을 것으로 예상 할 수 있습니까?

StackOverflow https://stackoverflow.com/questions/1880405

  •  18-09-2019
  •  | 
  •  

문제

나는 웹에서 "SVN에서 Go"및 기타 "Git-SVN 워크 플로"기사를 많이 읽었지만 여전히 지나치게 단순한 상황을 다루고 있다고 생각합니다. 그들은 종종 풀, 페치, 병합 등과 같은 GIT의 전체 힘을 사용하지 않고 GIT를 사용하고 현지에서 해킹하려는 사람들을 대상으로합니다. 여전히 (공식) SVN 저장소에 언제든지 변경 사항을 푸시 할 수 있으며 GIT에서 작업하고 물건을 공유하는 등으로 돌아갈 수 있습니다.

이 기사들이 당신이 순수한 git에서 당신이하는 모든 일을 할 수 없다는 것을 인정할 때마다, 결과와 가능한 스크류 업은 명확하게 설명되지 않습니다 (또는 아마도 나일 것입니까?). Git-Svn Man Page조차도 경고를 언급하지만 실제로는 광범위한 방식이 아닙니다.

내가 읽은 내용을 바탕으로 GIT-SVN이 특정 방식으로 사용될 때 문제가있을 수 있다고 생각합니다. 누군가 내가 이것에 대해 옳은지 말해 줄 수 있습니까?

다음은 "원하는"방식입니다.

  1. SVN 저장소에 프로젝트가 있습니다
  2. 개발자 git-svn-clone은 SVN Repo입니다. 그는 현지에서 물건을 해킹하기 시작합니다
  3. 개발자 B Git-SVN-Clone은 동일한 SVN Repo입니다. 그는 스스로 물건을 해킹하기 시작합니다.
  4. 한동안 그렇게하면 Devs C/D/...을 추가하고 "Standard"SVN을 수행하는 다른 개발자가 원래 리포에 커밋하는 경우 GIT 사용자는 코드를 공유하고 모든 종류의 GIT Magic을 수행하려고합니다. .
  5. 그 git 사용자 중 한 명은 현재 병합 된 변경 사항을 SVN (DCommit?)으로 밀어 넣을 수 있기를 원합니다.

내 질문은 : 내가 꿈꾸는가? 나는 얼마 전에 git 책에서 git-svn-clone이 SVN Repo의 "거울"인 git 리포지토리를 만들 수 있다고 생각하지만 다른 개발자들에 의해 그런 식으로 만든 git 리포지토리를 만들 수 있다고 생각합니다. IDS "그리고 커밋은 다른 해시를 가질 것입니다. 그래서 나는 그 git 리포지토리가 공통의 git 조상을 공유하지 않으므로 공유, 병합 등이 필요한 모든 git 명령을 사용할 수 없다는 것이 었습니다. 사실입니까, 우리는이 워크 플로에 문제에 직면 할 것인가?

때때로 나는 "공식적인"베어 git 저장소를 사용하여 이것을 할 수 있다는 것을 읽었으며, 그것은 Git-SVN 클로닝 된 유일한 유일한 것이며, 모든 git 사용자는 이것을 형성해야 할 것입니다. 그런 다음이 중앙 Git Repo를 담당하는 사람이 필요하고 Git Devs 간의 변경 사항을 수집하여 모든 것을 SVN Repo에 Dcompicting습니다. 이것은 GIT 사용자가 원래 GIT Repo가 SVN에서 나온 것을 "알지 못하는"유일한 방법이며, 원하는대로 모든 GIT 명령을 사용할 수 있습니다. GIT와 SVN에 유창 해야하는 유일한 사람 (GIT-SVN 경고에 대해 알고 있음)은 "Merge Manager"(또는 그가 호출되는 것)입니다.

Git-SVN 경고를 완전히 오해하고 있습니까? 더 간단한 방법이 있습니까?

도움이 되었습니까?

해결책

문제는 물론 4 단계입니다. DCommit은 지역 기록을 서버로 재생하려고합니다. DCommit은 귀하가 SVN 클라이언트 인 척합니다. 이제 Dcommitting 코드가 귀하 로부터만이 아니라면 SVN으로 DCommit가 어려운 것입니다.

다음은 다음과 같습니다 전문가 문제에 대해 작성합니다.

  • SVN과의 단순성 및 상호 운용을 위해 SVN 서버 (원격 SVN 저장소)에서 직접 모든 GIT-SVN 사용자가 복제, 가져 오기 및 DCOMMIT를 복제하고 모든 git-clone/pull/merge/push를 피하는 것이 좋습니다. GIT SVN 클론을 통해 검색되는 GIT 리포지토리와 분기 간의 작업은 원격 SVN 저장소로 변경 사항을 뒤로 밀기 위해 사용됩니다.
  • GIT 분기와 사용자간에 코드를 교환하는 권장 방법은 GIT 형식 패치 및 GIT AM 또는 SVN 저장소에 GIT SVN DCOMMIT입니다.
  • git svn dcommit은 내부적으로 git svn rebase를 사용하기 때문에 Git Svn dcommit 전에 우리가 git을 푸시하려면 원격 리포지토리에서 기존 심판의 덮어 쓰기를 강요해야합니다. 이것은 일반적으로 나쁜 관행으로 간주됩니다. 자세한 내용은 Git-Push 문서를 참조하십시오.
  • Git Merge 또는 Git Pull을 실행하는 것은 우리가 SVN DCommit을 GIT로 만들 계획을 세우는 것이 권장되지 않습니다. SVN은 합리적이거나 유용한 방식으로 합병을 나타내지 않으므로 SVN을 사용하는 사용자는 우리가 만든 병합을 볼 수 없습니다. 또한, 우리가 SVN 지점의 거울 인 git 지점에서 병합 또는 git 당겨지면 Git Svn Dcommit은 잘못된 지점에 커밋 할 수 있습니다.
  • Git Clone은 Refs/ Remotes/ Hierarchy 또는 Git-SVN 메타 데이터 또는 구성 하에서 분기를 복제하지 않습니다. 따라서 GIT-SVN을 사용하여 생성 및 관리하는 저장소는 사용해야합니다. rsync복제의 경우 복제가 완료되어야합니다.
  • 우리는 이미 dcommitted 변경에 대한 git 커밋 옵션을 사용해서는 안됩니다. 우리가 이미 다른 사용자를위한 원격 저장소로 밀어 넣은 -amend commits에 대한 나쁜 관행으로 간주되며, SVN이있는 DCommit은 유사합니다. 이에 대한 자세한 내용은 단일 커밋 수정 및 재 작성 기록과 관련된 문제.

다른 팁

나는 최근에 이것으로 많은 실험을 해왔으며, 나는 다소 작동하는 설정을 생각해 냈다고 생각합니다. 그렇습니다. 엄격한 Rebase 전용 체제입니다. 예, 복잡하지만 현지에서 작동하는 데 GIT를 사용하게됩니다 (속도, 기록, 보관소, 색인 등).

내가 생각하는 팀의 다른 GIT 사용자와 협력 할 때 무대 뒤에서 지점을 사용할 수 있지만 개인적으로 너무 많이 실험하지는 않았습니다. dcommitting 전에 로그를 선형화하는 한 작동해야합니다.

다음은 짧은 버전입니다 (이미 말한 것을 많이 반복) :

  1. 중앙 서버의 "페치"repo로 전복 리포를 복제하십시오.
  2. 같은 서버에서 "베어"리포를 시작하십시오.
  3. Fecthing Repo에서 Bare Repo로 밀어 넣으십시오
  4. 개발자에게 베어 레포를 복제하고 그 다음에 복제하십시오
    1. git svn init svnurl git-svn 리모컨을 구성합니다
    2. git update-ref refs/remotes/git-svn refs/remotes/origin/master 따라서 Git-Svn은 개정에 대한 포인터를 가지고 있습니다
  5. 자동으로 (Commit Hook) "가져 오기"Repo SVN Rebase가 있고 베어 레포로 밀어 넣습니다.
  6. 개발자들은 베어 레포에서 가져옵니다 git pull --rebase
  7. 개발자가 실행됩니다 git svn dcommit 먼저 반복해야합니다 update-ref 위의 새로운 개정판이 SVN에서 오는 경우.

있습니다 이 페이지의 워크 플로의 그림 (이미지를 인화하기 전에 더 많은 평판 포인트가 필요합니다). 업데이트 : 여기서 우리는 간다 :

내가했던 것은 초기 Git SVN 클론을 만들고 GIT를 사용하는 개발자들 사이에서 공유 한 것입니다. 그래서 우리는 정확히 동일한 참조를 가졌습니다.

선형 트리에 머무르는 한 (즉, 병합 대신 재건)하는 한 GIT 사용자간에 "특정 GIT 기능"을 사용할 수 있었기 때문에 올바르게 작동하는 것처럼 보였습니다.

"분산 된"문제에 들어가 자마자, 당신은 개발자들 사이에서 클로닝 된 한 번의 git repo를 사용하는 것이 좋습니다.
공개 SVN Repo에 대한 내보내기 단계와 관련하여 다른 사람을 사용하려면 스크립트
GIT2SVN 및 SVN2GIT 마법을 캡슐화하는 데 도움이 될 수 있습니다.

GIT 및 SVN 저장소에서 작업 할 때의 다른 고려 사항은 질문에 있습니다. "Git, 2 SVN 프로젝트 및 단일"WorkCopy "에 대한 워크 플로 및 도움말"

전복 저장소와 동기화 된 git 저장소 공유 문제를 해결하는 도구가 있습니다.

서브 git GIT-SVN 양방향 서버 측 미러입니다.

Subversion Repository에 하위 문을 설치하고 SVN과 자동으로 동기화 할 수 있습니다.

$ subgit configure $SVN_REPOS
# Adjust $SVN_REPOS/conf/subgit.conf to specify branches, tags and other options;
# Adjust $SVN_REPOS/conf/authors.txt to specify git & svn authors mapping
$ subgit install $SVN_REPOS
...
$ INSTALLATION SUCCESSFUL

Subgit은 사전 커밋 및 사후 커밋 후크를 Subversion Repository, Pre-Receive 및 Post-Receive Hooks에 Git 리포지토리로 설치합니다. 결과적으로 SVN 및 GIT 측면에서 들어오는 수정을 즉시 번역합니다. 설치 후 개발자는 GIT 클라이언트를 사용하여 GIT 리포지토리를 복제하고 작업 할 수 있습니다.

Subgit은 GIT-SVN에 의존하지 않으며 팀이 개발 한 자체 번역 엔진을 사용합니다. 이에 대한 자세한 내용은 확인할 수 있습니다 서브 git 대 Git-Svn 비교. 서브 git에 대한 일반 문서를 사용할 수 있습니다 여기.

Subgit의 버전 1.0은 Subversion 리포지토리에 대한 로컬 액세스가 필요합니다. IE SVN 및 GIT 저장소는 동일한 호스트에 상주해야합니다. 그러나 버전 2.0을 사용하면 GIT 프록시 모드를 소개 할 예정입니다. 전복 및 GIT 리포지토리가 어디에나 위치 할 수 있고 GIT 리포지토리만이 서브 git이 설치되었을 때, 즉 전복 저장소가 그대로 남아 있습니다.

Subgit은 상용 제품입니다. 오픈 소스, 학업 프로젝트 및 최대 10 명의 커밋터가있는 프로젝트에는 무료입니다.

면책 조항 : 저는 서브 git 개발자 중 하나입니다.

나는 찾았다 이 블로그 게시물 이는 전력 저장소와 동기화하기위한 별도의 분기를 유지하는 것이 좋습니다.

내가 GIT-SVN으로 인식하는 문제 중 하나는 git-svn-id를 커밋 의견에 저장한다는 것입니다. 이것은 해당 커밋을 다시 쓰기 때문에 SHA1로 변경되므로 사람들이 공유 할 곳이 어디든 밀어 붙일 수 없습니다.

SVN 개정 속성 기능을 사용하여 원격 SVN 개정에 BZR Revid를 저장하기 때문에 실제로 BZR-SVN을 선호합니다. 대신 로컬 개정 재 작성이 없음을 의미합니다. 또한 동일한 SVN 지점의 2 개의 독립적 인 풀로 동일하고 상호 운용 가능한 BZR 브랜치를 초래할 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top