sourcecode

다른 git 저장소에서 cherry-pick이 가능합니까?

codebag 2023. 4. 18. 22:37
반응형

다른 git 저장소에서 cherry-pick이 가능합니까?

저는 git 저장소에서 작업하고 있습니다. git 저장소에서 커밋을 필요로 합니다. git 저장소는 최초에 대해 전혀 알지 못합니다.

보통 체리픽을 하는데HEAD@{x}되지만, 는 '리프로그'이기 입니다..git는 이 엔트리 디렉토리)에 또, 어떻게 이 엔트리를 할 수 「reflog」(「Da」)를 선택할 수 있을까요, 「reflog」(「Da」)는, 「Reflog」(「」)는, 「Reflog」(R)는 「R」(R)에 대해서 아무것도 모릅니다.

하고 git-svn★★★★★★★★★★★★★★★★★를 사용하고 있습니다.git-svntrunk repo의 브랜치는 repo를 사용하고 .git-svn이치노

정답은 형식 패치를 사용하는 것입니다만, 문제는 다른 폴더에서 체리 픽을 하는 방법이었기 때문에, 다음과 같은 코드를 사용할 수 있습니다.

$ git --git-dir=../<some_other_repo>/.git \
format-patch -k -1 --stdout <commit SHA> | \
git am -3 -k

2014년 8월 28일 Cong Ma 코멘트

git format-patch 명령어는 SHA에 의해 지정된 some_other_repo의 커밋(-1개의 단일 커밋만 해당)에서 패치를 만듭니다.이 패치는 git am으로 파이핑됩니다.git am은 패치를 로컬로 적용합니다(-3은 패치가 정상적으로 적용되지 않는 경우 3방향 머지를 시도합니다).

다른 리포지토리를 원격으로 추가한 다음 변경 사항을 가져와야 합니다.거기서 커밋을 볼 수 있고 체리픽을 할 수 있습니다.

이런 식으로:

git remote add other https://example.link/repository.git
git fetch other

이것으로 간단하게 할 수 있는 모든 정보를 얻을 수 있습니다.

이 작업이 완료되면 리모콘이 더 이상 필요하지 않은 경우 를 사용하여 다시 리모콘을 제거할 수 있습니다.

git remote remove other

리모트 조작의 상세한 것에 대하여는, https://git-scm.com/book/en/v2/Git-Basics-Working-with-Remotes 를 참조해 주세요.

다음은 remote-fetch-merge의 예입니다.

cd /home/you/projectA
git remote add projectB /home/you/projectB
git fetch projectB

다음으로 다음 작업을 수행할 수 있습니다.

git cherry-pick <first_commit>..<last_commit>

또는 브랜치 전체를 Marge할 수도 있습니다(모든 것을 Marge할 필요가 있는 경우에만).

git merge projectB/master

당신은 할 수 있지만, 두 단계를 거쳐야 합니다.방법은 다음과 같습니다.

git fetch <remote-git-url> <branch> && git cherry-pick FETCH_HEAD

<remote-git-url> fromcherry pick의 합니다.

<branch>원격 저장소에서 체리픽할 지점 또는 태그 이름을 지정합니다.

할 수 요.FETCH_HEAD지사에서 Git SHA를 발급받았습니다.

갱신: @pkalinow 피드백에 따라 수정되었습니다.

다음은 리모트 추가, 브랜치 가져오기 및 커밋을 선택하는 단계입니다.

# Cloning our fork
$ git clone git@github.com:ifad/rest-client.git

# Adding (as "endel") the repo from we want to cherry-pick
$ git remote add endel git://github.com/endel/rest-client.git

# Fetch their branches
$ git fetch endel

# List their commits
$ git log endel/master

# Cherry-pick the commit we need
$ git cherry-pick 97fedac

출처 : https://coderwall.com/p/sgpksw

Git에서 패치를 만들고 적용하는 방법을 참조하십시오.(질문 문구를 통해 이 다른 저장소는 전혀 다른 코드베이스용인 것으로 추측됩니다.동일한 코드베이스의 저장소인 경우 @CharlesB에서 제안하는 대로 리모트로 추가해야 합니다.다른 코드 베이스의 경우라도 리모트로 추가할 수는 있지만, 브랜치 전체를 저장소에 삽입하고 싶지 않을 수도 있습니다.

다음과 같이 한 줄로 할 수 있습니다.체리 픽된 거스름돈이 필요한 git 저장소에 있고 올바른 브랜치를 위해 체크아웃하셨기를 바랍니다.

git fetch ssh://git@stash.mycompany.com:7999/repo_to_get_it_from.git branchToPickFrom && git cherry-pick 02a197e9533
# 

git [branch URL][Branch to cherry pick from]& git cherry pick [ commit ID ]

네. 저장소를 가져온 다음 원격 분기에서 체리 픽을 수행합니다.

같은 머신에 다른 쪽 repo가 있는 경우 패치를 적용한 후 원래 메시지를 커밋하면 체리픽과 같은 효과를 얻을 수 있습니다.다음은 예를 제시하겠습니다.

$ git apply <(git -C "$PATH_TO_OTHER_REPO" show "$COMMIT_HASH")
$ MSG="$(git -C "$PATH_TO_OTHER_REPO" log -n 1 --pretty=format:'%s' "$COMMIT_HASH")"
$ git commit -m "$MSG"

저는 자주 하지 않아도 되기 때문에 이 작업 흐름도 괜찮습니다.그러나 이를 위해 커스터마이즈된 Git 명령어를 구성하는 것은 상당히 쉬울 것이고, 더 좋고 더 자동화될 것입니다.

「 」내의 해 주세요.<(...)하는 모든 이 될 수 .git show,git diff 를 사용합니다.wget ★★★★★★★★★★★★★★★★★」curl클론을 생략할 수), Github 의 diff 컨텐츠를 취득합니다.cat로 매우하다.그 대사 자체는 매우 유용합니다.

A 하고 또, 「Cherry pick」, 「Cherry pick」, 「Cherry pick」, 「Cherry pick」를 참조해 주세요.B을 하고 은, 「을 , 「을 뽑을 수 .</path/to/repo/A/>/.git/objects로로 합니다.</path/to/repo/B>/.git/objects/info/alternates. 를이것을생성합니다.alternates파일(존재하지 않는 경우)을 클릭합니다.

이렇게 하면 repo B가 repo A의 모든 git 오브젝트에 액세스 할 수 있게 되어 체리픽이 기능하게 됩니다.

이 경우 일부 현지화된 검증을 위해 커밋을 "cherry picked"해야 합니다.또한 동일한 저장소 체크아웃에 대해 로컬 커밋(서버에 아직 푸시되지 않음)을 사용할 수도 있습니다.

예.

  • similar
  • 에는 브랜치 repo1이 .b1HEAD 2커밋 포함) 되었습니다.commit_x컬에있있 있있있다다
  • 에는 분기 repo2가 .bb1 - 수수to cherry-pickcommit_x.

이걸 위해서

$cd repo2

repo2 $git fetch <path_to_repo1>

repo2 $ git cherry-pick <commit_x>

「」는,commit_x (의 도움을 ) 할 수 있고됩니다.fetch를 참조해 주세요.

여기 @radicand의 코멘트에서 영감을 받아 메모리에서 타이핑하기 쉬운 것이 있습니다.단조의 기능에 따라 다르지만 Github, Gitlab, Gitea가 확실히 지원하고 있습니다.

.patchgit am:

curl --location URL.patch | git am

--location 예를 들면, 풀 요구로부터 하는 경우에 하는 리다이렉트)에 .리다이렉트에는 풀 요구에서 패치를 복사할 때 발생할 수 있습니다.

제 상황은 팀이 밀어붙이는 맨 레포와 바로 옆에 있는 레포의 복제품이 있다는 것이었습니다.Makefile의 다음 행이 올바르게 동작합니다.

git reset --hard
git remote update --prune
git pull --rebase --all
git cherry-pick -n remotes/origin/$(BRANCH)

베어 레포의 마스터를 최신 상태로 유지함으로써 제안된 변경 사항을 베어 레포에 게시할 수 있습니다.또한 통합 검토 및 테스트를 위해 여러 개의 브래치를 체리픽하는 (좀 더 복잡한) 방법도 있습니다.

"knowing nothing"이 "리모콘으로 사용할 수 없음"을 의미한다면 도움이 되지 않지만, 이 워크플로우를 작성하기 위해 검색하던 중 이 SO 질문이 떠올랐기 때문에 다시 기여해야겠다고 생각했습니다.

특정 커밋에 도달할 때까지 특정 파일에 대해 여러 커밋을 체리픽할 경우 다음 명령을 사용합니다.

# Directory from which to cherry-pick
GIT_DIR=...
# Pick changes only for this file
FILE_PATH=...
# Apply changes from this commit
FIST_COMMIT=master
# Apply changes until you reach this commit
LAST_COMMIT=...

for sha in $(git --git-dir=$GIT_DIR log --reverse --topo-order --format=%H $LAST_COMMIT_SHA..master -- $FILE_PATH ) ; do 
  git --git-dir=$GIT_DIR  format-patch -k -1 --stdout $sha -- $FILE_PATH | 
    git am -3 -k
done

언급URL : https://stackoverflow.com/questions/5120038/is-it-possible-to-cherry-pick-a-commit-from-another-git-repository

반응형