Git 저장소 컨텐츠를 다른 저장소 보존 히스토리로 이동


141

다음 명령을 사용하여 한 저장소 ( repo1) 의 내용 만 다른 기존 저장소 ( repo2) 로 이동하려고 합니다.

git clone repo1
git clone repo2
cd repo1
git remote rm origin
git remote add repo1
git push

그러나 작동하지 않습니다. 비슷한 게시물을 검토했지만 내용이 아닌 폴더를 이동하는 것을 발견했습니다.


repo1의 내용을 repo2의 브랜치 또는 마스터의 일부로 사용하여 두 repos의 폴더가 작업 디렉토리에 공존합니까?
Chronial

마스터의 일부로 옮기고 싶습니다.
마리오

4
이 튜토리얼은 완벽합니다! smashingmagazine.com/2014/05/19/…
xpto

답변:


242

찾고있는 명령은 다음과 같습니다.

cd repo2
git checkout master
git remote add r1remote **url-of-repo1**
git fetch r1remote
git merge r1remote/master --allow-unrelated-histories
git remote rm r1remote

그 후 와의 repo2/master모든 내용이 포함되며 둘 다의 역사도 갖게됩니다.repo2/masterrepo1/master


감사합니다 Chronial, 나는 단지 repo1에도 하나의 브랜치가 있는지 확인하고 싶습니다. 그리고 그 브랜치를 repo2로 옮기려면 어떻게해야합니까?
마리오

음, repo2에도 두 번째 분기가 있습니까? 아니면 그 지점은 어떻게됩니까?
Chronial 2016 년

1
Chronial, 위의 comands는 작동하지 않았습니다! 역사를 복사하지 않았습니다.
Mario

1
좋아, 이제 효과가 있었다. 나는 다음 명령을 사용했다 : cd repo2,> git remote rm origin> git remote add origin url-of-repo1 ,> git fetch r1remote> git push origin master
Mario

1
@abhijithda 가장 간단한 해결책은 병합하기 전에 모든 것을 repo1하위 폴더 (내부 repo1) 로 옮기는 것 입니다.
Chronial

55

https://www.smashingmagazine.com/2014/05/moving-git-repository-new-server/에 완벽하게 설명되어 있습니다.

먼저 기존 리포지토리에서 로컬 인덱스로 모든 원격 브랜치 및 태그를 가져와야합니다.

git fetch origin

로컬 복사본을 만들어야하는 누락 된 분기를 확인할 수 있습니다.

git branch -a

새 저장소의 SSH 복제 URL을 사용하여 기존 로컬 저장소에 새 원격을 작성하십시오.

git remote add new-origin git@github.com:manakor/manascope.git

이제 모든 로컬 브랜치 및 태그를 new-origin이라는 새 원격으로 푸시 할 준비가되었습니다.

git push --all new-origin 
git push --tags new-origin

new-origin을 기본 리모컨으로 만들어 봅시다 :

git remote rm origin

new-origin의 이름을 origin으로 변경하여 기본 리모트가되도록하십시오.

git remote rename new-origin origin

4
전체 히스토리 및 태그가 복사되는지 확인할 수 있습니다. 아주 좋아요 감사.
Alex

새로운 출처에 커밋이 없으면 잘 작동합니다. 그러나 새로운 출처에 커밋이 있으면 여기에 언급 된 방법이 예상대로 표현되지 않습니다.
caot

당신은 git checkout BranchName지점을 git push --all new-origin
흔들고

21

기존 지점을 보존하고 역사를 커밋하려는 경우 여기에 도움이되는 한 가지 방법이 있습니다.

git clone --mirror https://github.com/account/repo.git cloned-repo
cd cloned-repo
git push --mirror {URL of new (empty) repo}

# at this point only remote cloned-repo is correct, local has auto-generated repo structure with folders such as "branches" or "refs"
cd ..
rm -rf cloned-repo
git clone {URL of new (empty) repo}
# only now will you see the expected user-generated contents in local cloned-repo folder

# note: all non-master branches are avaialable, but git branch will not show them until you git checkout each of them
# to automatically checkout all remote branches use this loop:
for b in `git branch -r | grep -v -- '->'`; do git branch --track ${b##origin/} $b; done

이제 소스 및 대상 리포지토리를 일정 시간 동안 동기화 상태로 유지하려고한다고 가정합니다. 예를 들어, 현재 원격 저장소 내에서 여전히 새 / 대체 저장소로 가져 오려는 활동이 있습니다.

git clone -o old https://github.com/account/repo.git my-repo
cd my-repo
git remote add new {URL of new repo}

최신 업데이트를 풀다운하려면 (로컬 변경 사항이 없다고 가정) :

git checkout {branch(es) of interest}
git pull old
git push --all new

NB : 아직 서브 모듈을 사용하지 않았기 때문에 하위 모듈이있을 경우 어떤 추가 단계가 필요한지 모르겠습니다.


1
이것은 간단하고 쉽게 나를 위해 일했습니다. 나는 이것이 정답이어야한다고 생각합니다. 당신이 60 지점이 있다면, 이것은 갈 길입니다.
rickfoosusa

7

코드가 이미 Git에 의해 추적 된 경우 가장 간단한 방법은 새 저장소를 "원본"으로 설정합니다.

cd existing-project
git remote set-url origin https://clone-url.git
git push -u origin --all
git push origin --tags

6

이것은 내 로컬 리포지토리 (히스토리 포함)를 원격 github.com 리포지토리로 옮기는 데 효과적이었습니다. GitHub.com에서 새로운 빈 저장소를 생성 한 후 아래 3 단계에서 URL을 사용하면 효과적입니다.

git clone --mirror <url_of_old_repo>
cd <name_of_old_repo>
git remote add new-origin <url_of_new_repo>
git push new-origin --mirror

나는 이것을 https://gist.github.com/niksumeiko/8972566 에서 찾았다.


1
이것이 원래 저장소를 만드는 가장 쉬운 방법입니다. 또한 모든 분기를 복사합니다.
기예르모

1
또한 모든 태그를 복사합니다.
까마귀

2

아래의 방법을 사용하여 모든 지점과 커밋 기록을 유지하여 GIT Stash를 GitLab으로 마이그레이션했습니다.

이전 저장소를 로컬로 복제하십시오.

git clone --bare <STASH-URL>

GitLab에 빈 저장소를 만듭니다.

git push --mirror <GitLab-URL>

1

당신이 가까이있는 것 같습니다. 제출시 오타가 아니라고 가정하면 3 단계 cd repo2는 repo1 대신에 있어야합니다. 그리고 6 단계는 git pull밀지 않아야합니다 . 재 작업 목록 :

1. git clone repo1
2. git clone repo2
3. cd repo2
4. git remote rm origin
5. git remote add repo1
6. git pull
7. git remote rm repo1
8. git remote add newremote

고마워 Eric, 그러나 3 단계에서 원격 변경을 피하기 위해 원래 저장소의 링크를 제거하고 싶습니다. 내용을 repo1에서 repo2로 옮기고 싶습니다.
마리오

좋구나. 그것을 반영하기 위해 답변을 편집했습니다. 확인하기 위해 repo2의 저장소 인 repo2를 만들려고하지만 repo1 또는 원점을 원격으로 유지하지 않습니까?
Eric Palace

아니요, 새로운 repo "repo2"를 만들려고하지 않습니다. 실제로, 나는 다른 내용을 가지고있는 기존 repo2를 가지고 있습니다. 이제 모든 repo1 내용을 히스토리가있는 repo2로 옮기고 싶습니다. 서버에있는 것처럼 repo1을 비워 둘 것입니다.
마리오

자식을 사용하지 않는 것을 고려 했습니까? 아마도 gui 또는 scp 또는 ftp를 통해 파일을 복사하고 수동으로 git repo에 추가 할 수있는 것 같습니다. 효율적이지 않을 수도 있지만 더 간단합니다.
Eric Palace

나는 이미 그것을 시도했지만 역사를 떠났다. 나는 그것의 모든 역사를 옮기고 싶다.
마리오

1

@ Dan-Cohn의 답변에 따라 Mirror-push는 당신의 친구입니다. 이것은 repos를 마이그레이션하기 위해 이동 한 것입니다.

리포지토리 미러링

1. Git Bash를 엽니 다.

2. 저장소의 복제본을 만듭니다.

$ git clone --bare https://github.com/exampleuser/old-repository.git

3. 새 저장소로 미러 푸시하십시오.

$ cd old-repository.git
$ git push --mirror https://github.com/exampleuser/new-repository.git

4.1 단계에서 생성 한 임시 로컬 리포지토리를 제거합니다.

$ cd ..
$ rm -rf old-repository.git

참조 및 신용 : https://help.github.com/en/articles/duplicating-a-repository


-1

여기에는 복잡한 답변이 많이 있습니다. 그러나 분기 보존과 관련이없는 경우 원격 원점을 재설정하고 업스트림을 설정 한 후 푸시하기 만하면됩니다.

이것은 나를 위해 모든 커밋 기록을 보존하는 데 효과적이었습니다.

cd <location of local repo.>
git remote set-url origin <url>
git push -u origin master
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.