기존 Git 저장소를 SVN으로 푸시
나는 Git에서 모든 일을 하고 GitHub으로 밀고 있습니다.저는 소프트웨어와 사이트 모두에 매우 만족하고 있으며, 현 시점에서는 제 작업 관행을 바꾸고 싶지 않습니다.
제 박사과정 지도교수는 모든 학생들에게 대학에서 주최하는 SVN 저장소에 그들의 작품을 보관할 것을 요청하고 있습니다.기존 SVN 저장소를 Git로 끌어내려는 수많은 문서와 튜토리얼을 찾았지만 Git 저장소를 새로운 SVN 저장소로 밀어넣는 것에 대해서는 아무것도 없었습니다.저는 git-svn과 신선한 가지와 리베이스, 그리고 모든 멋진 용어들의 조합으로 이것을 할 수 있는 어떤 방법이 있을 것이라고 기대하지만, 저는 git newbie이고 그들 중 누구에게도 자신감을 느끼지 못합니다.
그런 다음 몇 가지 명령을 실행하여 원하는 경우 해당 SVN 저장소에 커밋을 푸시하고 싶습니다.나는 Git를 계속 사용하고 Git에 있는 것을 SVN 저장소에 반영하기를 원합니다.
SVN에 헌신하는 유일한 사람이 될 것입니다, 만약 이것이 변화를 가져온다면.
저도 이것이 필요했고, 봄베의 대답 + 약간의 장난으로, 저는 그것을 작동시켰습니다.조리법은 다음과 같습니다.
Git 가져오기 -> 전복
1. cd /path/to/git/localrepo
2. svn mkdir --parents protocol:///path/to/repo/PROJECT/trunk -m "Importing git repo"
3. git svn init protocol:///path/to/repo/PROJECT -s
4. git svn fetch
5. git rebase origin/trunk
5.1. git status
5.2. git add (conflicted-files)
5.3. git rebase --continue
5.4. (repeat 5.1.)
6. git svn dcommit
#3 이후에는 다음과 같은 암호화된 메시지가 표시됩니다.
: 상위수의 URL 사용:
protocol:///path/to/repo/PROJECT => protocol:///path/to/repo
그냥 무시하세요.
#5를 실행하면 충돌이 발생할 수 있습니다.병합되지 않음 상태의 파일을 추가하고 기본 재배치를 다시 시작하여 이러한 문제를 해결합니다.최종적으로 작업을 완료한 후 다음을 사용하여 SVN 저장소로 다시 동기화합니다.dcommit
이상입니다.
리포지토리 동기화 유지
이제 다음 명령을 사용하여 SVN에서 Git로 동기화할 수 있습니다.
git svn fetch
git rebase trunk
Git에서 SVN으로 동기화하려면 다음을 사용합니다.
git svn dcommit
최종 노트
활성 리포지토리에 적용하기 전에 로컬 복사본에서 이 작업을 수행해 보는 것이 좋습니다.Git 저장소의 복사본을 임시 위치로 만들 수 있습니다. 간단히 사용할 수 있습니다.cp -r
모든 데이터가 저장소 자체에 있기 때문입니다.그런 다음 다음을 사용하여 파일 기반 테스트 저장소를 설정할 수 있습니다.
svnadmin create /home/name/tmp/test-repo
그리고 다음을 사용하여 작업 복사본을 체크아웃합니다.
svn co file:///home/name/tmp/test-repo svn-working-copy
그러면 지속적인 변화를 주기 전에 물건을 가지고 놀 수 있습니다.
부록:당신이 망치면,git svn init
만약 당신이 실수로 도망친 경우git svn init
URL이 잘못되어 작업을 백업할 수 없을 정도로 똑똑하지 못했기 때문에(묻지마...) 동일한 명령을 다시 실행할 수 없습니다.그러나 다음 명령을 실행하여 변경 내용을 실행 취소할 수 있습니다.
rm -rf .git/svn
edit .git/config
섹션을 제거합니다.[svn-remote "svn"]
부분.
그러면 실행할 수 있습니다.git svn init
신간의
다음은 우리가 이를 실현한 방법:
컴퓨터의 어딘가에 Git 저장소를 복제합니다.
을 엽니다..git/config
Git 저장소의 읽기 전용 SVN 미러 유지 관리에서 다음을 추가합니다.
[svn-remote "svn"]
url = https://your.svn.repo
fetch = :refs/remotes/git-svn
이제 콘솔 창에서 다음을 입력합니다.
git svn fetch svn
git checkout -b svn git-svn
git merge master
어떤 이유로든 여기서 중단될 경우 다음 세 줄을 입력합니다.
git checkout --theirs .
git add .
git commit -m "some message"
마지막으로 SVN에 커밋할 수 있습니다.
git svn dcommit
참고: 이 폴더는 나중에 항상 폐기합니다.
용사를 합니다.git rebase
직접적으로 첫 번째 커밋을 잃게 됩니다.Git은 그것을 다르게 취급하고 그것을 다시 기초할 수 없습니다.
전체 기록을 보존하는 절차가 있습니다. http://kerneltrap.org/mailarchive/git/2008/10/26/3815034
솔루션을 여기에 기록하겠지만 크레딧은 비외른을 위한 것입니다.
git-svn 초기화:
git svn init -s --prefix=svn/ https://svn/svn/SANDBOX/warren/test2
는 "같은 합니다. 부르면 이 나오지 --prefix "svn/trunk"는 "svn/trunk"입니다. 이는 로컬 분기를 "trunk"라고만 부르면 모호한 이름을 얻을 수 없기 때문입니다.그리고.-s
는 표준 트렁크/배선/배선 레이아웃의 바로 가기입니다.
SVN에서 초기 항목 가져오기:
git svn fetch
이제 루트 커밋의 해시를 찾아봅니다(단일 커밋을 표시해야 함).
git rev-list --parents master | grep '^.\{40\}$'
그런 다음 빈 트렁크 커밋의 해시를 가져옵니다.
git rev-parse svn/trunk
이식편을 작성합니다.
git replace --graft <root-commit-hash> <svn-trunk-commit-hash>
이제 에는 "gitk", "gitk", "gitk"가 표시되어야 .svn/trunk
마스터 분기의 기반이 되는 첫 번째 커밋입니다.
이식편을 영구적으로 만듭니다.
git filter-branch -- ^svn/trunk --all
이식편을 놓습니다.
git replace -d <root-commit-hash>
gitk는 여전히 보여줘야 합니다.svn/trunk
주인의 혈통을 이어받은
트렁크 위에 기록을 선형화합니다.
git svn rebase
이제 "git svndcommit -n"이 트렁크에 커밋할 것임을 알려줍니다.
git svn dcommit
프로젝트의 하위 버전 저장소에 새 디렉터리를 만듭니다.
# svn mkdir --parents svn://ip/path/project/trunk
Git 관리 프로젝트로 변경하고 Git-svn을 초기화합니다.
# git svn init svn://ip/path/project -s
# git svn fetch
SVN 프로젝트 디렉터리가 여전히 비어 있기 때문에 단일 커밋이 생성됩니다. 그 커밋에 모든 기초합니다, 이제모것그약기초서해에속을든▁now해,서.git svn dcommit
그리고 당신은 끝나야 합니다.하지만 그것은 당신의 약속 날짜를 심각하게 망칠 것입니다.
Git -> 완전한 커밋 기록이 있는 SVN
저는 Git 프로젝트가 있어서 SVN으로 옮겨야 했습니다.이것이 제가 만든 방법입니다. 모든 커밋 기록을 유지하는 것입니다.libSVN이 하기 때문에 입니다. libSVN은 할 때 시간을 합니다.git svn dcommit
.
방법:
항목을 가져올 SVN 저장소가 있고 git-svn을 사용하여 복제할 수 있습니다.
git svn clone https://path.to/svn/repository repo.git-svn`
이동:
cd repo.git-svn
Git 저장소의 원격을 추가합니다(이 예에서는 C:/Projects/repo.git을 사용합니다).SVN에 푸시하여 Old-git라는 이름을 지정하려고 합니다.
git remote add old-git file:///C/Projects/repo.git/
마스터 분기의 정보를 Old-git 저장소에서 현재 저장소로 가져옵니다.
git fetch old-git master
Old-git Remote의 마스터 분기를 현재 리포지토리에서 Old라고 하는 새 분기로 체크아웃합니다.
git checkout -b old old-git/master`
헤드를 Old-git/master 위에 놓으려면 기본 재배치합니다.이렇게 하면 모든 커밋이 유지됩니다.이것이 기본적으로 하는 것은 Git에서 수행된 모든 작업을 SVN에서 액세스하는 작업 위에 놓는 것입니다.
git rebase master
이제 마스터 분기로 돌아갑니다.
git checkout master
그리고 당신은 당신이 깨끗한 커밋 이력을 가지고 있다는 것을 알 수 있습니다.이것이 SVN에 적용할 내용입니다.
SVN으로 작업 푸시:
git svn dcommit
이상입니다.그것은 매우 깨끗하고 해킹이 없으며 모든 것이 즉시 완벽하게 작동합니다.즐거운 시간 되세요.
SubGit를 사용하는 4개의 명령어로 매우 짧은 명령어를 제안합니다.자세한 내용은 이 게시물을 참조하십시오.
기존 Git 저장소를 빈 SVN 저장소에 커밋해야 했습니다.
이렇게 할 수 있었습니다.
$ git checkout master
$ git branch svn
$ git svn init -s --prefix=svn/ --username <user> https://path.to.repo.com/svn/project/
$ git checkout svn
$ git svn fetch
$ git reset --hard remotes/svn/trunk
$ git merge master
$ git svn dcommit
문제없이 작동했습니다.이것이 누군가에게 도움이 되길 바랍니다.
SVN 저장소에 다른 사용자 이름을 사용하여 자신에게 권한을 부여해야 했기 때문입니다(내 이름).origin
키), 저는 "/", "/", ""을 .--username
소유물.
Git를 주 저장소로 계속 사용하고 가끔 수정사항을 SVN으로 "내보내기"만 하면 되는 경우에는 Tailor를 사용하여 SVN 저장소를 동기화할 수 있습니다.다른 소스 제어 시스템 간에 리비전을 복사할 수 있으며 Git에서 변경한 내용으로 SVN을 업데이트합니다.
Git-to-SVN 변환은 시도하지 않았지만 SVN -> SVN 예제의 경우 다음 답변을 참조하십시오.
그러나 효과가 있었던 또 다른 시퀀스(각 단계에 대한 설명 포함):
를 설치합니다.
git-svn
그리고.subversion
툴킷:sudo apt-get install git-svn subversion
내부에서 합니다.
PROJECT_FOLDER
cd PROJECT_FOLDER
서버에 합니다(불행히도 의 하위불서경트생로성현재도히행젝로프버전버
git-svn
플러그인은 TorothySVN)과 비교하여 결함이 있습니다.를 스코드직저수없다에 할 수 없습니다.PROJECT_FOLDER
으로 모든 를 대신기으로코업로니다합드를드모든본적에 합니다.PROJECT_FOLDER/trunk
.svn mkdir --parent protocol://path/to/repo/PROJECT_FOLDER/trunk -m "gitrepo 자리 표시자 만들기"
은 여가바로기가 입니다.trunk
경로의 끝에는 필수 항목입니다.
기화를 합니다.
git-svn
플러그인 컨텍스트 의 플러그인.git
foldergit svn init -s protocol:///path/to/repo/PROJECT_FOLDER
은 여가바로기가 입니다.
trunk
그 길의 끝에는 불필요합니다.빈칸가를 가져옵니다.
Subversion
정보git svn fetch
와 Subversion 서버를 하는 데 .
git-svn
지금이 바로 이 입니다.git-svn
이 플그설을 합니다.remotes/origin
하여 경로및연킵니다시관경와로▁the와 합니다.trunk
서버 측의 하위 폴더입니다.기본적으로 이전 Git 커밋이 이전에 발생했습니다.
git-svn
플러그인이 프로세스에 참여했습니다(이 단계는 선택 사항).git rebase origin/trunk
커밋할 새/수정된 파일 추가(이 단계는 Git 활동에 대해 정기적이며 선택 사항임)
git add .
새로 추가한 파일을 로컬 Git 저장소에 커밋합니다(이 단계는 선택 사항이며 7단계를 사용한 경우에만 적용 가능).
git commit -m "Importing Git repository"
모든 프로젝트 변경 내역을 하위 버전 서버로 푸시:
git svn dcommit
새 SVN 저장소를 만들 수 있습니다.Git 프로젝트를 내보냅니다(.git 파일을 내보냅니다).SVN 저장소에 추가합니다(지금까지 Git에 있었던 것으로 저장소 초기화).그런 다음 새 Git 프로젝트에서 SVN 리포지토리를 가져오는 방법에 대한 지침을 사용합니다.
하지만 이것은 당신의 이전 Git 기록을 잃게 될 것입니다.
특정 SVN을 사용할 필요가 없고 GitHub을 사용하는 경우 해당 SVN 커넥터를 사용할 수 있습니다.
자세한 내용은 다음과 같습니다: GitHub에서 Subversion과 공동 작업
최근에 몇 개의 Git 저장소를 SVN으로 마이그레이션해야 했는데, 찾을 수 있는 모든 솔루션을 사용해 본 결과, 결국 Mercurial이 제게 도움이 되었습니다(예, 세 번째 VCS 사용).이 가이드를 사용하여 다음 프로세스를 생각해냈습니다(Linux에서는 기본 아이디어가 Windows에서도 작동해야 함).
필요한 패키지:
$ sudo apt-get install git subversion mercurial python-subversion
을 Mercurial에 .
~/.hgrc
:[extensions] hgext.convert=
임시 작업 디렉토리를 생성합니다(저는 마이그레이션할 저장소가 여러 개 있어서 SVN 및 Git 버전을 별도로 유지하기 위해 디렉토리를 생성했습니다).
$ mkdir svn $ mkdir git
빈 로컬 SVN 저장소를 만듭니다.
$ svnadmin create svn/project
기존 Git 저장소 복제:
$ git clone server/path/project.git git/project
머큐리알이 알아서 하게 둬라:
$ hg convert --dest-type svn git/project svn/project
이제 SVN 저장소에는 전체 커밋 기록이 포함되어야 하지만 원래 타임스탬프는 포함되지 않습니다.문제가 없는 경우 11단계로 다음 부분을 건너뜁니다.
약간의 작업으로 각 커밋의 날짜와 시간을 변경할 수 있습니다.저장소가 상당히 작기 때문에 수동으로 수행할 수 있었습니다.먼저 다음을 생성합니다.
pre-revprop-change
필요한 속성을 수정할 수 있도록 다음 내용으로 SVN 저장소를 후크합니다.#!/bin/bash exit 0;
이 스크립트는 실행 가능해야 합니다.
$ chmod +x svn/project/hooks/pre-revprop-change
Mercurial은 프로젝트-wc라는 SVN 저장소의 작업 복사본을 생성했으므로 이 저장소로 전환하고 커밋 시간을 편집합니다.
$ cd project-wc $ svn propedit svn:date --revprop -r 1
올바른 날짜와 시간을 입력하고(시간대에 주의!) 저장합니다." property 1이라는됩니다.revision 1"에 있는 속성 svn:date에 새 값을 설정합니다.
이제 다른 모든 수정본에 대해 헹구고 반복합니다.선택적으로 커밋 기록을 확인하여 모든 것이 정상인지 확인합니다.
$ svn log -r 1:HEAD
그런 다음 한 단계 위로 이동합니다.
$ cd ..
리포지토리 덤프:
$ svnadmin dump svn/project > project.dump
서브버전 서버에 덤프를 로드합니다.알았어!
이 프로세스는 원격 저장소 간에도 직접 작동할 수 있지만 로컬 저장소를 사용하는 것이 더 쉽다는 것을 알게 되었습니다.커밋 시간을 수정하는 것은 많은 작업이었지만, 전반적으로 프로세스는 제가 찾은 다른 어떤 방법보다 훨씬 더 간단했습니다.
세 가지 방법이 있습니다.
기본 재배치: 다른 답변과 같이
id: 및 id, info: commit id: svn first commit id: svn first commit id: git first commit id.git/info/get.
echo "git_id svn_id}" > .git/info/grafts
그리고나서git svn dcommit
모든 git commit 확인, 파일을 svn_repo에 복사, svn commit
bash 데모: github 데모
v1.x: 기본 재배치 및 커밋 ID 사용
v2.x: 복사 파일을 사용한 다음 svn 커밋
제 경우에는 SVN에서 클린 프로젝트를 시작해야 했습니다.
$ Project> git svn init protocol://path/to/repo -s
$ Project> git svn fetch
모든 프로젝트 소스 추가...
$ Project> git add .
$ Project> git commit -m "Importing project sources"
$ Project> git svn dcommit
저는 WordPress 커뮤니티에서 사용되고 있는 Scatter라는 훌륭한 도구를 공유하고 싶습니다.
Git WordPress 플러그인과 약간의 제정신 산란.
이를 통해 사용자는 Git 저장소를 wordpress.org SVN으로 자동 전송할 수 있습니다.이론적으로 이 코드는 모든 SVN 저장소에 적용할 수 있습니다.
저는 단지 제 경험의 일부를 수락된 답변과 공유하고 싶습니다.마지막 단계를 실행하기 전에 모든 단계를 수행했고 모든 것이 정상이었습니다.
git svn dcommit
git svnd 커밋
/usr/lib/perl5/vendor_perl/5.22/Git/SVN.pm line 101에서 초기화되지 않은 값 $u를 대체하여 사용합니다.
연결(.)에서 초기화되지 않은 값 $u 사용 또는 /usr/lib/perl5/vendor_perl/5.22/Git/SVN.pm line 101.refs/remotes/origin/HEAD: '/https://192.168.2.101/svn/PROJECT_NAME'에서 문자열 사용
저는 https://github.com/nirvdrum/svn2git/issues/50 스레드를 찾았고 마침내 101행 /usr/lib/perl5/vendor_perl/5.22/Git/SVN.pm 의 다음 파일에 적용한 솔루션을 찾았습니다.
교체했습니다
$u =~ s!^\Q$url\E(/|$)!! or die
와 함께
if (!$u) {
$u = $pathname;
}
else {
$u =~ s!^\Q$url\E(/|$)!! or die
"$refname: '$url' not found in '$u'\n";
}
이것이 제 문제를 해결했습니다.
이것이 제가 할 일입니다.내 지역 지점이 호출되었다고 가정할 때main
정확하게 기억이 나지 않으니 공백을 채워주세요.git svn
명령어는 오랫동안 사용하지 않았기 때문입니다.
- 프로젝트에 사용할 분기를 svn에 만듭니다.
- 사용하다
git svn
원하는 svn repo를 복제하려면(최소한 사용하려는 분기를 사용하여 이 작업에 대해 신경 쓰지 않는 수백만 개의 수정사항을 가져올 필요가 없습니다). - 새 gitrepo에서 svn 브랜치를 확인합니다.
- 프로젝트에 사용 중인 원래 Gitrepo를 가리키는 원격을 이 리포지토리에 추가합니다.리모컨이 호출되었다고 가정해 보겠습니다.
the-real-stuff
. git fetch the-real-stuff
그래서 우리는 진짜 레포에 무엇이 있는지 볼 수 있습니다.- 를 svn에할 때, 이 그를 "수 을 속여야 . 이이우처합할코드이때라속을올할합다니우리는수야여있것것도이록그그코드를병려을고는리가어점것나로음로으끌하를it▁given을다:▁we할합▁g니it합▁into▁so▁trick▁to▁have속▁can▁themer▁our▁code▁"▁that야▁that▁this수n있리▁will우,▁that▁it여▁the.
git merge --allow-unrelated-histories the-real-stuff/main -m "Whatever comment I want in the svn revision"
이렇게 하면 두 분기가 로컬로 "합병"됩니다. git svn dcommit
프로젝트의 내용을 지금처럼 푸시할 수 있습니다.
원본 Git repo 작업을 계속합니다.그런 다음 svn에 푸시하려는 경우 git svn 클론으로 이동하여 다음을 수행합니다.
git fetch the-real-stuff # get visibility to the changes in the original git repo
git merge the-real-stuff/main -m "Whatever comment I want to show on this svn revision"
git svn dcommit
그리고 당신은 끝났습니다.
저는 2 repo를 사용하여 svn 자료로 원본 repo를 작성하지 않도록 하는 아이디어를 좋아합니다. 단, 전체를 하나의 git repo에 보관하는 것은 가능합니다.
만약 당신이 Git에서 하는 모든 약속을 SVN 저장소에 적용하고 싶지 않다면요?파이프 위로 커밋을 선택적으로 전송하려면 어떻게 해야 합니까?글쎄요, 더 좋은 해결책이 있어요.
저는 SVN에서 가져오고 병합하는 것이 전부인 로컬 Git 저장소를 가지고 있습니다.이렇게 하면 SVN과 동일한 변경 사항을 모두 포함할 수 있지만 커밋 기록은 SVN과 완전히 분리됩니다.
그런 다음 별도의 SVN 로컬 작업 복사본을 별도의 폴더에 보관합니다.이것이 바로 SVN에 대한 커밋입니다. 이를 위해 SVN 명령줄 유틸리티를 사용합니다.
로컬 Git 저장소의 상태를 SVN에 커밋할 준비가 되면 모든 파일을 로컬 SVN 작업 복사본에 복사하고 Git 대신 SVN을 사용하여 커밋합니다.
이런 식으로 저는 리베이스를 할 필요가 없습니다. 리베이스는 프리베이스와 같기 때문입니다.
언급URL : https://stackoverflow.com/questions/661018/pushing-an-existing-git-repository-to-svn
'source' 카테고리의 다른 글
확인란 설정/해제 (0) | 2023.05.21 |
---|---|
Node.js가 종료되기 직전 정리 작업 수행 (0) | 2023.05.21 |
x=x+1 대x + = 1 (0) | 2023.05.21 |
Node.js를 백그라운드 프로세스로 실행하고 절대 죽지 않는 방법은 무엇입니까? (0) | 2023.05.21 |
Microsoft를 사용하여 Excel에서 데이터 세트로 가져오는 방법사무실. 인터럽트.엑셀? (0) | 2023.05.21 |