Есть ли возможность выбрать коммит из другого репозитория git? - PullRequest
643 голосов
/ 25 февраля 2011

Я работаю с git-репозиторием, который нуждается в коммите из другого git-репозитория, который ничего не знает о первом.

Обычно я выбираю вишню, используя HEAD@{x} в reflog, но потому что это.git ничего не знает об этой записи reflog (другой физический каталог), как я могу это выбрать или могу?

Я использую git-svn.Моя первая ветвь использует git-svn из trunk репозитория Subversion, а следующая ветвь использует git-svn в ветке Subversion.

Ответы [ 10 ]

811 голосов
/ 01 марта 2012

Ответ, как и было дано, заключается в использовании format-patch, но поскольку вопрос заключался в том, как выбрать вишню из другой папки, вот фрагмент кода, предназначенный для этого:

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

(объяснение от @ cong ma )

Команда git format-patch создает патч из some_other_repo Коммит, указанный его SHA (-1 для одного отдельного коммита). это патч передан в git am, который применяет патч локально (-3 означает попытка трехстороннего слияния, если исправление не может быть применено чисто). надежда это объясняет.

470 голосов
/ 25 февраля 2011

Вам нужно будет добавить другой репозиторий в качестве удаленного, а затем получить его изменения. Оттуда вы видите коммит и можете его выбрать.

Вот так:

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

Теперь у вас есть вся информация, чтобы просто сделать git cherry-pick.

Подробнее о работе с пультами здесь: https://git -scm.com / book / ru / v2 / Git-Basics-Working-with-Remotes

135 голосов
/ 14 июля 2012

Вот пример удаленного извлечения-слияния.

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

Тогда вы можете:

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

или даже объединить целую ветку

git merge projectB/master
116 голосов
/ 15 марта 2013

Вы можете сделать это, но это требует двух шагов.Вот как:

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

Замените <remote-git-url> на URL или путь к хранилищу, из которого вы хотите выбрать вишню.

Замените <branch> на имя ветви или тега, которое вы хотитеcherry-pick из удаленного репозитория.

Вы можете заменить FETCH_HEAD git SHA из ветви.

Обновлено: изменено на основе отзывов @ pkalinow.

57 голосов
/ 17 сентября 2014

Вот шаги для добавления удаленного, извлечения веток и выбора коммитов

# 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

17 голосов
/ 25 февраля 2011

См. Как создать и применить патч с Git . (Из формулировки вашего вопроса я предположил, что этот другой репозиторий предназначен для совершенно другой кодовой базы. Если это репозиторий для той же кодовой базы, вы должны добавить его в качестве удаленного, как предложено @CharlesB. Даже если это для другого кодовая база, я думаю, вы все равно можете добавить его в качестве удаленного, но вы можете не захотеть получить всю ветку в свой репозиторий ...)

10 голосов
/ 17 сентября 2015

Вы можете сделать это в одной строке следующим образом. Надеюсь, что вы находитесь в git-репозитории, который нуждается в подобранных изменениях, и вы проверили, чтобы исправить ветку.

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

git fetch [URL-адрес ветви] [Ветка для выбора вишни из] && git cherry-pick [идентификатор фиксации]

5 голосов
/ 25 февраля 2011

Да. Извлеките хранилище, а затем извлеките вишню из удаленной ветки.

1 голос
/ 08 апреля 2016

Предполагая, что A - это репо, из которого вы хотите выбрать вишню, а B - это то, что вы хотите выбрать, вы можете сделать это, добавив </path/to/repo/A/>/.git/objects к </path/to/repo/B>/.git/objects/info/alternates.Создайте эти alternates файлы, если они не существуют.

Это позволит репо B получить доступ ко всем объектам git из репо A и заставит вишню выбрать для вас.

0 голосов
/ 31 мая 2013

Моя ситуация состояла в том, что у меня есть голое репо, к которому толкает команда, и клон этого сидящего рядом с ним.Этот набор строк в Makefile корректно работает для меня:

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

Поддерживая актуальность основного репо, мы можем точно выбрать предлагаемое изменение, опубликованное в голом репо.У нас также есть (более сложный) способ выбора нескольких веток для консолидированной проверки и тестирования.

Если «ничего не знает» означает «нельзя использовать как удаленный», то это не поможет, но этот ТАК вопрос возник, когда я гуглил вокруг, чтобы придумать этот рабочий процесс, поэтому я решил внести свой вклад.

...