문제

저는 현재 svn에서 추적되는 웹 사이트 프로젝트를 진행 중이지만 다른 사람이 새 서버 등을 설정할 시간이 생기면 git으로 이동할 예정입니다.이야기가 좀 길지만 그 동안 나는 내가 갖고 있는 일부 코드로 나만의 git 저장소를 만들고 꽤 많은 작업을 했습니다.나는 해외에 있고 인터넷 연결이 이상하고 HTTP에 대한 프록시가 필요하기 때문에 git svn clone을 사용하지 않았으며 git svn이 통과하지 못하는 것 같습니다.어쨌든 나는 내 자신의 git 저장소에서 개발을 해왔지만 결국 프로젝트를 실제로 제대로 가져오면 내 작업을 git-svn 복제된 항목으로 리베이스해야 합니다.할 것이다 git rebase 이거 제대로 작동해?

한 가지 문제는 제가 실제로 가상 머신에서 작업하고 있었고 많은 커밋에 대해 user.name 및 user.email 구성 항목을 설정하지 않았으므로 커밋이 vm의 로컬 사용자로부터 온 것임을 깨닫지 못했다는 것입니다. 이상해.모든 변경 사항을 diff 파일로 수집한 다음 새 브랜치가 생성되면 이를 새 브랜치 위에 적용하는 것이 더 낫습니까?

또 다른 문제는 이전의 SVN 사용이 다소 미성숙했기 때문에 프로덕션 서버에는 제가 갖고 있지 않은 커밋되지 않은 변경 사항이 실제로 있었다는 것입니다.사실, 처음에는 SVN 헤드도 아닌 이전 버전의 코드가 있었기 때문에 그 위에 몇 가지 내용이 누락되었습니다.진행하는 가장 좋은 방법은 무엇입니까?

마지막 질문 중 하나는 다음을 통해 SVN 저장소를 가져오는 경우입니다. git svn (방금 확인했는데 지금 작동하는 것 같습니다.) 작성자 파일을 추가하지 않았습니다. 나중에 작성자 파일을 사용하여 적절하게 가져온 브랜치에 변경 사항을 리베이스할 수 있습니까?

아, 새로운 합병증이군요.다음을 사용하여 SVN 저장소를 직접 가져왔습니다. git svn, 이 느린 연결로 인해 이틀이 넘는 시간이 소요되는 힘든 과정이었습니다.그러나 마침내 복제를 마친 후 SVN 저장소에서는 코드가 모두 하위 디렉터리에 있었지만 내 git 저장소에서는 저장소의 루트가 디렉터리의 루트이기도 하다는 것을 깨달았습니다.조금 헷갈리면 기본적으로는 이렇습니다

SVN:

\dir\codez

자식:

\codez

두 저장소를 어떻게 결합할 수 있나요?계속해서 rebase를 사용할 수 있기를 바라지만 이것은 정말 이상한 상황인 것 같습니다.서브모듈과 비슷하게 들리지만, 그것이 나에게 꼭 필요한 것은 아니라고 생각합니다.

도움이 되었습니까?

해결책

나는 해외에 있고 인터넷 연결이 이상하고 HTTP에 대한 대리가 필요하기 때문에 git svn 클론을 사용하지 않았습니다.

설정하면 작동해야합니다

http_proxy=http://username:passwword@pprroxyHost:proxyPort

또는 시도 할 수 있습니다

http_proxyUser=username
http_proxyPassword=password
http_proxyHost=aProxyHost
http_proxyPort=aProxyPort

git rebase가 이것을 위해 제대로 작동합니까?

일반적인 답변 : 그렇습니다. 아직 GIT 지점을 게시하지 않았기 때문입니다.
자세한 답변 : 마스터의 결과를 병합하기 전에 먼저 지점에 다시 제출해야합니다. 보다 이 답변.
충돌을 해결할 수 있기 때문에 선호하는 워크 플로입니다. 당신의 병합하기 전에 지점 (또는 역사를 지키고 싶다면 리바스)을 마스터에게 지사하십시오.
실제로, 당신은 아래에서 특별한 "병합"지점을 만드는 것이 실제로 더 나은 아이디어라는 것을 아래에서 볼 수 있습니다.

user.name 및 user.email config entries를 설정하지 않았다는 것을 깨닫지 못했습니다.

아직 게시하지 않았으므로 filter-branch 커밋을 수정하고 사용자 이름과 이메일을 변경하려면

작은 SH 스크립트가 도움이 될 수 있습니다

#!/bin/sh

git filter-branch --env-filter '

n=$GIT_AUTHOR_NAME
m=$GIT_AUTHOR_EMAIL

case ${GIT_AUTHOR_NAME} in
        aSystemUserName) n="TheActual Name" ; m="TheActual@mailAddress" ;;
esac

export GIT_AUTHOR_NAME="$n"
export GIT_AUTHOR_EMAIL="$m"
export GIT_COMMITTER_NAME="$n"
export GIT_COMMITTER_EMAIL="$m"
'

Repo 에서이 스크립트를 호출하면 완료됩니다.

나는 SVN 헤드조차 없었던 첫 번째 장소에서 코드의 오래된 개정을 가졌으므로 그 위에는 물건이 없어졌습니다. 진행하는 가장 좋은 방법은 무엇입니까?

이 경우 기본 워크 플로우는 Rebase 노력을 분리하고 모든 충돌을 해결하기 위해 현재 작업 지점에서 새로운 "병합"지점을 작성하는 것입니다.
델타가 중요한 경우 이러한 종류의 합병에서는 다음을 포함시키기 위해 필요한 모든 변경 사항에서 작업 지점을 깨끗하게 유지해야합니다.

  • SVN의 코드
  • SVN 저장소에서 직접 얻지 못한 코드.

나중에 저자 파일로 제대로 가져온 지점에 변경 사항을 다시 비제 할 수 있습니까?

확실하지 않지만 그렇게 생각합니다. 그렇지 않다면, 아직 아무것도 게시하지 않은 한, 당신은 filter-branch 다시 스크립트 이름을 바꾸고 ...

다른 팁

git-rebase 역사 어딘가에 공통 커밋이 있는지에 따라 다릅니다.이는 단일 저장소 내에서도 발생합니다.(a) 새로운 git-svn 가져온 저장소가 귀하의 저장소와 분리되어 있고 (b) 둘 사이에 공통 커밋이 없는 상황에 처하게 될 것 같습니다.패치를 통해 이 작업을 수행해야 할 수도 있지만 git이 도움을 줄 수 있습니다.맨페이지를 확인하세요. git-format-patch 그리고 git-am.첫 번째는 다양한 커밋에서 일련의 패치를 생성할 수 있고, 두 번째는 이 일련의 패치를 가져와 적용할 수 있으며 모든 커밋 메시지 등은 보존됩니다.

이렇게 하면 user.name/email 문제를 해결할 수 있는 기회가 제공됩니다. 패치 헤더에서 간단히 수정하고 패치를 적용하기 전에 새로 가져온 저장소에 올바르게 설정되었는지 확인할 수 있습니다!

오래된 시작 위치("이전 버전...SVN 헤드도 아니었습니다.") 아마도 다음과 같을 것입니다:

  • 모든 변경 사항이 커밋된 상태에서 SVN 저장소를 좋은 상태로 만듭니다.
  • git-svn으로 가져오기
  • 작업을 시작한 이전 커밋에서 브랜치를 생성하고 체크아웃하세요.
  • 패치 시리즈를 적용하세요
  • 이 분기를 현재 SVN 헤드에 해당하는 마스터로 병합합니다.

저에게는 다행이지만 여러분에게는 그렇지 않습니다. 저는 git-svn을 사용할 필요가 없었기 때문에 작성자 파일 질문에 확실하게 대답할 수 없습니다.그러나 내가 올바르게 이해했다면 작성자 파일은 SVN 작성자를 git 작성자로 변환합니다.git 커밋에서 작성자가 변경되면 해시가 변경됩니다.그러므로 이 번역표를 망치지 않고 처음부터 올바르게 만드는 것이 중요합니다.

여기에 질문이 너무 많았는데, 빠진 부분이 있으면 언제든지 댓글로 질문하고 추가 질문을 해주세요.

저수준 도구로 태어나지 않은 새로운 지점을 만들 수 있습니다.

$ git symbolic-ref HEAD refs/heads/new_branch

현대적인 git을 사용하면 사용하여 전체 지점을 다시 비제 할 수 있습니다. --root "Git Rebase"의 옵션.

이것은 당신의 상황에 도움이 될 수 있습니다. ymmv.

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