수색…


비고

정말 큰 SVN 저장소 복제하기

gnot-svn이 SVN 저장소의 전체 히스토리를 다시 작성해야하기 때문에 SVN 저장소 역사가 실제로 매우 크면이 작업을 수행하는 데 몇 시간이 걸릴 수 있습니다. 다행히 SVN repo를 한 번만 복제하면됩니다. 다른 git 저장소와 마찬가지로 repo 폴더를 다른 공동 작업자에게 복사 할 수 있습니다. 여러 대의 컴퓨터에 폴더를 복사하는 것은 큰 SVN repos를 처음부터 복제하는 것보다 빠를 것입니다.

커밋 및 SHA1 정보

git svn dcommit 명령을 사용할 때 로컬 git 커밋이 다시 작성 됩니다. 이 명령은 SVN 서버에서 생성 된 SVN 버전을 참조하는 git commit 메시지에 텍스트를 추가합니다. 이는 매우 유용합니다. 그러나 새 텍스트를 추가하려면 실제로 수행 할 수없는 기존의 커밋 메시지를 수정해야합니다. git 커밋은 변경할 수 없습니다. 해결책은 동일한 내용과 새 메시지로 새로운 커밋을 만드는 것이지만 어쨌든 기술적으로 새로운 커밋입니다 (즉, git commit의 SHA1이 변경됩니다)

git-svn 용으로 작성된 git 커밋은 로컬이므로 git 커밋 용 SHA1 ids는 각 git 리포지토리마다 다릅니다! 이것은 SHA1을 사용하여 다른 사람으로부터 커밋을 참조 할 수 없다는 것을 의미합니다. 왜냐하면 동일한 커밋은 각 로컬 자식 저장소에 다른 SHA1을 가지기 때문입니다. 서로 다른 저장소 사본 사이의 커밋을 참조하려면 SVN 서버로 푸시 할 때 커밋 메시지에 추가 된 svn 개정 번호를 사용해야합니다.

SHA1을 로컬 작업에 사용할 있지만 (특정 커밋, 체리 선택 및 재설정 등을 표시 / 비교)

문제 해결

git svn rebase 명령이 체크섬 불일치 오류를 발생시킵니다.

git svn rebase 명령은 다음과 유사한 오류를 발생시킵니다.

  Checksum mismatch: <path_to_file> <some_kind_of_sha1>
  expected: <checksum_number_1>
    got: <checksum_number_2>

이 문제에 대한 해결책은 문제가 발생한 파일이 마지막으로 수정되었을 때 svn을 수정본으로 재설정하고 SVN 기록이 복원되도록 git svn 가져 오기를 수행하는 것입니다. SVN 재설정을 수행하는 명령은 다음과 같습니다.

  • git log -1 - <path_to_file> (커밋 메시지에 나타나는 SVN 개정 번호 복사)
  • git svn reset <revision_number>
  • 자식 SSV 가져 오기

다시 SVN에서 데이터를 푸시 / 풀링 할 수 있어야합니다.

파일이 커밋에서 발견되지 않았습니다. SVN에서 가져 오거나 가져 오려고하면 다음과 비슷한 오류가 발생합니다

<file_path> was not found in commit <hash>

이것은 SVN의 개정판이 어떤 이유로 든 로컬 사본에 존재하지 않는 파일을 수정하려고한다는 것을 의미합니다. 이 오류를 없애는 가장 좋은 방법은 가져 오기가 해당 파일의 경로를 무시하도록 강제하고 최신 SVN 개정판의 상태로 업데이트됩니다.

  • git svn fetch --ignore-paths <file_path>

SVN 저장소 복제하기

명령을 사용하여 저장소의 새 로컬 복사본을 만들어야합니다.

git svn clone SVN_REPO_ROOT_URL [DEST_FOLDER_PATH] -T TRUNK_REPO_PATH -t TAGS_REPO_PATH -b BRANCHES_REPO_PATH

SVN 저장소가 표준 레이아웃 (트렁크, 분기, 태그 폴더)을 따르는 경우 몇 가지 입력을 줄일 수 있습니다.

git svn clone -s SVN_REPO_ROOT_URL [DEST_FOLDER_PATH]

git svn clone 각 SVN 리비전을 하나씩 체크 아웃하고 히스토리를 다시 만들기 위해 로컬 리포지토리에서 git commit을 만듭니다. SVN 저장소에 많은 커밋이있는 경우 시간이 걸릴 것입니다.

명령이 끝나면 SVN 저장소의 트렁크 분기를 추적하는 master라는 로컬 분기가있는 완전한 git 저장소가 생성됩니다.

SVN에서 최신 변경 사항 가져 오기

git pull 과 동일한 것은 명령입니다.

git svn rebase

이렇게하면 SVN 저장소의 모든 변경 사항이 검색되어 현재 분기의 로컬 커밋 상단 에 적용됩니다.

이 명령을 사용할 수도 있습니다.

git svn fetch

SVN 저장소에서 변경 사항을 검색하여 로컬 시스템으로 가져 오지 만 로컬 지사에 적용하지 않아야합니다.

로컬 변경 사항을 SVN으로 푸시

명령

git svn dcommit

각 git 커밋에 대한 SVN 개정판을 작성합니다. SVN과 마찬가지로 로컬 git 내역은 SVN 저장소의 최신 변경 사항과 동기화되어야하므로 명령이 실패하면 먼저 git svn rebase 수행하십시오.

지역에서 일하기

일반 git 명령을 사용하여 로컬 git 저장소를 일반 git repo로 사용하십시오.

  • git add FILEgit checkout -- FILE 을 스테이지 / 언 스테이지하기
  • git commit 변경 사항을 저장합니다. 이러한 커밋은 로컬 일 것이고 일반 자식 저장소와 마찬가지로 SVN 저장소에 "푸시"되지 않습니다.
  • git stashgit stash pop 사용 허용
  • git reset HEAD --hard 모든 로컬 변경 내용을 git reset HEAD --hard
  • git log 저장소의 모든 git log 액세스합니다.
  • git rebase -i 그래서 당신은 당신의 지역 역사를 자유롭게 다시 쓸 수있다.
  • git branchgit checkout 을 사용하여 로컬 브랜치 만들기

git-svn 문서에서 "Subversion은 Git보다 훨씬 덜 정교한 시스템입니다."그래서 Subversion 서버의 히스토리를 망쳐 놓지 않고 git의 모든 기능을 사용할 수는 없습니다. 다행히도 규칙은 매우 간단합니다. 기록을 선형으로 유지하십시오.

이것은 브랜치 생성, 커밋 제거 / 재정렬 / 스쿼시 커밋, 히스토리 이동, 커밋 삭제 등 거의 모든 git 작업을 수행 할 수 있음을 의미 합니다 . 로컬 브랜치의 히스토리를 재 통합하려면 git rebase 사용하십시오.

병합을 수행하면 병합 커밋이 만들어집니다. 병합 커밋의 특별한 점은 두 부모가 있고 그 결과가 비선형이됩니다. 비선형 히스토리는 병합 커밋을 리포지토리에 "밀어 넣는"경우 SVN을 혼동합니다.

그러나 걱정하지 마십시오. git merge 커밋을 SVN에 "푸시"하면 아무 것도 깨뜨리지 않습니다 . 그렇게하면 git merge 커밋이 svn 서버로 보내지면 해당 병합에 대한 모든 커밋의 모든 변경 사항이 포함되므로 해당 커밋의 기록은 손실되지만 코드의 변경 사항은 잃게됩니다.

빈 폴더 처리

자식은 폴더의 개념을 인식하지 못한다. 단지 파일과 파일 경로만으로 동작한다. 이것은 자식이 빈 폴더를 추적하지 않는다는 것을 의미합니다. 그러나 SVN이 그렇습니다. git-svn을 사용하면 git을 사용하여 빈 폴더를 포함하는 모든 변경 사항이 기본적 으로 SVN에 전달되지 않습니다 .

주석을 발행 할 때 --rmdir 플래그를 사용하면이 문제가 해결되고 내부의 마지막 파일을 로컬로 삭제하면 SVN의 빈 폴더가 제거됩니다.

git svn dcommit --rmdir

불행히도 기존의 빈 폴더는 제거하지 않으므로 수동으로해야합니다.

dcommit을 할 때마다 플래그를 추가하지 않거나 git GUI 도구 (SourceTree 등)를 사용하는 경우 안전하게 재생하려면 다음 명령을 사용하여이 동작을 기본값으로 설정할 수 있습니다.

git config --global svn.rmdir true

이것은 .gitconfig 파일을 변경하고 다음 행을 추가합니다.

[svn]
rmdir = true

추적되지 않은 모든 파일과 SVN에 대해 비워 두어야하는 폴더를 제거하려면 git 명령을 사용하십시오.

git clean -fd

참고 : 이전 명령은 추적되지 않은 모든 파일과 빈 폴더를 제거합니다. 심지어 SVN에서 추적해야하는 파일도 포함됩니다! againg을 생성해야하는 경우 SVN에 의해 ​​추적 된 빈 폴더는 다음 명령을 사용하십시오.

git svn mkdirs

연습에서 이것은 untracked 파일과 폴더에서 작업 공간을 정리하려면 SVN이 추적 한 빈 폴더를 다시 생성하기 위해 항상 두 명령을 사용해야 함을 의미합니다.

git clean -fd && git svn mkdirs



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow