Возможно ли использовать вишневое захват из другого репозитория 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)
Удерживая мастера голого репо до сегодняшнего дня, мы можем сделать вид, что предложенное изменение опубликовано на голом репо. У нас также есть (более сложный) способ черешни-подборки нескольких блоков для консолидированного обзора и тестирования.
Если "ничего не знает" означает "нельзя использовать как удаленный", то это не поможет, но этот вопрос был поднят, поскольку я искал поиск, чтобы придумать этот рабочий процесс, поэтому я подумал, что вносить свой вклад.