Можно ли выбрать фиксацию из другого репозитория git?
Я работаю с репозиторием git, который нуждается в фиксации из другого репозитория git, который ничего не знает о первом.
обычно я бы вишневый выбор с помощью HEAD@{x} в reflog, но ведь это .git ничего не знает об этой записи reflog (различные физические каталога), как я могу выбрать это, или я могу?
Я использую git-svn. Моя первая ветка использует git-svn на trunk из репозитария, а в соседней ветке использует git-svn на a Ветка подрывной деятельности.
10 ответов:
вам нужно будет добавить другой репозиторий в качестве удаленного, а затем извлечь его изменения. Оттуда вы видите фиксацию, и вы можете выбрать вишню.
вот так:
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
ответ, как указано, заключается в использовании format-patch, но поскольку вопрос заключался в том, как выбрать вишню из другой папки, вот фрагмент кода, чтобы сделать именно это:
$ git --git-dir=../<some_other_repo>/.git \ format-patch -k -1 --stdout <commit SHA> | \ git am -3 -k(объяснение от @cong ma)
The
git format-patchкоманда создает Патч отsome_other_repo' s совершение указанного ша (-1только один коммит). Этот патч передается вgit am, который применяет патч локально (-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
вы можете сделать это, но это требует двух шагов. Вот как:
git fetch <remote-git-url> <branch> && git cherry-pick FETCH_HEADзаменить
<remote-git-url>С url-адресом или путем к репозиторию, из которого вы хотите выбрать вишню.заменить
<branch>С именем ветки или тега, которое вы хотите выбрать из удаленного репозитория.вы можете заменить
FETCH_HEADС git SHA из ветки.Обновлено: изменено на основе обратной связи @pkalinow.
вот шаги для добавления удаленного, выборки ветвей и вишневого выбора фиксации
# 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
посмотреть Как создать и применить патч с помощью Git. (Из формулировки вашего вопроса, я предположил, что этот другой репозиторий на совершенно другой кодовой базе. Если это репозиторий для той же базы кода, Вы должны добавить его в качестве удаленного, как предложено @CharlesB. Даже если это для другой базы кода, я думаю, вы все равно можете добавить его как удаленный, но вы не можете получить всю ветку в свой репозиторий...)
вы можете сделать это в одну строку следующим образом. Надеюсь, что вы находитесь в репозитории git, которому нужно вишневое изменение, и вы проверили, чтобы исправить ветку.
git fetch ssh://[email protected]:7999/repo_to_get_it_from.git branchToPickFrom && git cherry-pick 02a197e9533git fetch [филиал адрес URL][ветка к вишне-выбрать из] & & git cherry-pick [commit ID]
моя ситуация заключалась в том, что у меня есть голое РЕПО, к которому подталкивает команда, и клон, который сидит рядом с ним. Этот набор строк в файле Makefile работает правильно для меня:
git reset --hard git remote update --prune git pull --rebase --all git cherry-pick -n remotes/origin/$(BRANCH)сохраняя мастера голого РЕПО в актуальном состоянии, мы можем выбрать предлагаемое изменение, опубликованное в голом РЕПО. У нас также есть (более сложный) способ выбрать несколько брашей для консолидированного обзора и тестирования.
Если "ничего не знает" означает "не может быть использован в качестве удаленный", то это не помогает, Но этот вопрос возник, когда я искал в интернете, чтобы придумать этот рабочий процесс, поэтому я подумал, что внесу свой вклад.
предполагая, что
AЭто РЕПО, которое вы хотите выбрать из вишни, иB- это тот, который вы хотите выбрать, вы можете сделать это путем добавления</path/to/repo/A/>/.git/objectsдо</path/to/repo/B>/.git/objects/info/alternates. Создай этоalternatesфайлы, если он не существует.Это позволит РЕПО B получить доступ ко всем объектам git из РЕПО A и сделает работу cherry-pick для вас.
Comments