Возможно ли использовать вишневое захват из другого репозитория git?

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

Как правило, я выбрал бы cherry-pick, используя [email protected]{x} в reflog, но поскольку этот .git ничего не знает об этой записи reflog (другой физический каталог), как я могу сделать это, или я могу?

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

Ответ 1

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

Вот так:

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

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

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

Ответ 2

Ответ, как и было дано, заключается в использовании 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 означает попытку трехстороннего слияния, если патч не удается применить корректно). Надеюсь, это объясняет.

Ответ 3

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

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

Ответ 4

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

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

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

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

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

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

Ответ 5

Ниже приведены шаги для добавления удаленных ветвей, выборки и вишня-выберите фиксацию

# Cloning our fork
$ git clone [email protected]: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

Ответ 6

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

Ответ 7

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

git fetch ssh://[email protected]:7999/repo_to_get_it_from.git branchToPickFrom && git cherry-pick 02a197e9533
# 

git fetch [ответвление URL] [ответвление на cherry-pick из] && git cherry-pick [commit ID]

Ответ 8

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

Ответ 9

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

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

Ответ 10

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

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

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

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