programing

한 Gitrepo에서 다른 Gitrepo로 커밋을 복사하는 방법은 무엇입니까?

topblog 2023. 7. 12. 22:13
반응형

한 Gitrepo에서 다른 Gitrepo로 커밋을 복사하는 방법은 무엇입니까?

지난주에 Github repo를 생성했는데 repo에 대한 라이센스를 선택하는 것을 잊었습니다.이제 이미 3개의 큰 커밋이 있습니다.

기여자 3명에게 레포를 삭제하고 같은 이름으로 다시 만들어도 괜찮은지 물어봤는데, 이번에 레포를 만들 때 라이선스를 선택하면 괜찮았다고 합니다.

질문.

커밋을 새 레포(이번에는 첫 번째 커밋이 라이센스 파일임)에 넣고 커밋 메타 정보를 유지할 수 있는 방법이 있습니까?

커밋을 새 레포(이번에는 첫 번째 커밋이 라이센스 파일임)에 넣고 커밋 메타 정보를 유지할 수 있는 방법이 있습니까?

예, 원격을 추가하고 첫 번째 커밋 위에 커밋을 선택합니다.

# add the old repo as a remote repository 
git remote add oldrepo https://github.com/path/to/oldrepo

# get the old repo commits
git remote update

# examine the whole tree
git log --all --oneline --graph --decorate

# copy (cherry-pick) the commits from the old repo into your new local one
git cherry-pick sha-of-commit-one
git cherry-pick sha-of-commit-two
git cherry-pick sha-of-commit-three

# check your local repo is correct
git log

# send your new tree (repo state) to github
git push origin master

# remove the now-unneeded reference to oldrepo
git remote remove oldrepo

나머지 답변은 이전 보고서에 라이센스를 추가하려는 경우입니다.

예. 기본 재배치를 통해 라이센스 커밋을 첫 번째 커밋으로 지정할 수 있습니다.

재배치는 모든 커밋 작성자와 커밋 날짜를 그대로 유지하면서 커밋 순서를 재정렬하는 기트 방식입니다.

공유 보고서를 작성할 때는 팀 전체가 재능이 없는 한 일반적으로 권장되지 않습니다.그렇지 않은 경우 저장소의 새 복사본만 복제할 수 있습니다.

라이센스 커밋을 첫 번째 커밋으로 얻는 방법은 다음과 같습니다.

로컬 복사본 업데이트 및 기본 재배치

프로젝트를 체크아웃하고 현재 3개의 커밋 스택의 맨 위에 커밋 파일을 배치합니다.

#create LICENSE file, edit, add content, save
git add LICENSE
git commit -m 'Initial commit'

그런 다음 마스터 분기에서 대화형 기본 재배치를 수행하여 커밋을 재정렬합니다.

git rebase -i --root

편집기가 열립니다.맨 아래 줄("초기 커밋" 커밋, 가장 최근 커밋)을 파일의 맨 위로 이동합니다.그런 다음 편집기를 저장하고 종료합니다.

편집기를 종료하자마자 Git는 방금 지정한 순서대로 커밋을 작성합니다.

이제 리포지토리의 로컬 복사본이 업데이트되었습니다.수행:

git log

확인할 수 있습니다.

새 저장소를 github에 강제로 푸시

이제 복사본이 업데이트되었으므로 Github에 강제로 밀어넣어야 합니다.

git push -f origin master

그러면 github에서 마스터 분기를 새 위치로 이동하도록 지시합니다.이런 경우에는 모든 작업자가 보류 중인 변경 사항을 인지하고 있을 경우에만 강제로 밀어넣어야 합니다. 그렇지 않으면 공동작업자가 혼란스러워질 수 있습니다.

공동작업자를 github에 동기화

마지막으로 모든 공동작업자가 이 리포지토리에 동기화해야 합니다.

먼저 다음 명령은 저장되지 않은 변경사항이 있을 경우 손상될 수 있으므로 리포지토리를 정리해야 합니다.

# make sure there are no unsaved changes
git status 

# pull the latest version from github
git fetch  

# move their master branch pointer to the one you published to github.
git reset --hard origin/master

바로 그겁니다.이제 모두가 일치해야 합니다.

저도 비슷한 문제가 있었는데, 제가 실수를 깨닫기 전에 제 github에 보고서를 포크하는 것을 잊어버리고 몇 가지 커밋을 추가했습니다.

저는 꽤 간단한 해결책을 찾았습니다.

먼저 원래 레포로 원격을 제거합니다.

git remote remove origin

두 번째로 내 깃허브의 새 포크에 리모컨을 추가합니다.

git remote add origin <my repo URL>

그런 다음 오리진 마스터에 푸시를 했고 내 모든 커밋이 내 깃허브에 나타났습니다.

저는 다음과 같은 접근 방식을 사용했습니다.

  • 소스 레포를 /c/SrcRepo와 같은 폴더로 복제합니다.

  • 대상 repo를 /c/DstRepo와 같은 폴더로 복제하고 대상 분기로 전환합니다.

  • 대상 repo의 루트 폴더에서 다음 명령을 실행합니다.

    git pull /c/SrcReposorcBranch --allow-unrelated-histories

원격 참조를 추가로 생성할 필요 없음

@Mookowmoo의 답변을 바탕으로 하지만 조금 더 합리화하려고 노력합니다.

이것이 다르게 하는 것은 단지 리모콘이 정확하다고 가정하고 충돌을 최대한 피하려는 것입니다.

그러나 삭제된 파일을 잘 처리하지 못하므로 수동 요소가 남아 있습니다.

# assuming you are already on the branch you want to be
git remote add oldrepo https://github.com/path/to/oldrepo
git fetch oldrepo

# take all or subset of changes from a branch
git cherry-pick --strategy recursive --strategy-option theirs oldestCommitHash^..latestCommitHash

# or take all changes included in a specific merge commit (easiest)
git cherry-pick --strategy recursive --strategy-option theirs mergeCommitHash^..mergeCommitHash

# handling deleted files/unhandled conflicts
# just keep repeating this section
git mergetool
# either c/m or d based on if you want to keep or delete the files
git cherry-pick --continue
  • 대상 Git = UrlD(기존 콘텐츠는 상관 없음)
  • SourceGit = UrlS

    git clone UrlS
    
    git remote add origin2 UrlD
    
    git push -f origin2 master
    

이제 대상이 소스와 동일한 데이터를 갖게 됩니다(origin2 대신 origin2를 사용할 수도 있습니다).

당신은 이것을 시도할 수 있습니다, 그것은 쉽고 간단합니다.이렇게 하면 사용자가 사용하는 해시 이전(및 포함)의 모든 커밋이 푸시됩니다.<last-commit-hash-from-old-repo>다른 레포로:

git clone https://github.com/path/to/new-repo.git new-repo
cd new-repo
git remote add old https://github.com/path/to/old-repo.git
git remote update
git merge --allow-unrelated-histories <last-commit-hash-from-old-repo>
git push origin main

레포에서 다른 커밋으로 모든 커밋을 푸시해야 하는 사용자가 있다면 다음과 같이 병합 명령에 --squash를 추가하면 됩니다.

git clone https://github.com/path/to/new-repo.git new-repo
cd new-repo
git remote add old https://github.com/path/to/old-repo.git
git remote update
git merge --squash --allow-unrelated-histories <last-commit-hash-from-old-repo>
git push origin main

저의 경우 이전 저장소와 새 저장소의 차이점을 알아내야 했습니다.그래서 새로운 레포에 오래된 레포를 추가했습니다.

git remote add old https://gitlab.site.az/old-blog.git

모든 원격 가져오기

git fetch --all

다른 커밋 찾기

git log --graph --oneline --pretty=format:"%h%x09%an%x09%ad%x09%s" --abbrev-commit --date=relative develop..old/develop

선택한 커밋 가져오기

git cherry-pick SHA1 SHA2 SHA4

언급URL : https://stackoverflow.com/questions/37471740/how-to-copy-commits-from-one-git-repo-to-another

반응형