Как применить git патч из одного репозитория в другой?
у меня есть два репозитория, один из которых является основным РЕПО для библиотеки, а другой-проект, использующий эту библиотеку.
если я сделаю исправление в подчиненном проекте, я хотел бы простой способ применить этот патч обратно вверх по течению.
расположение файла отличается в каждом репозитории.
- Главная РЕПО:
www.playdar.org/static/playdar.js
:
playlick.com/lib/playdar.jsЯ пробовал использовать git format-patch -- lib/playdar.js в проекте playlick, а затем git am на основном РЕПО playdar, но разные местоположения файлов в файле патча вызвали ошибку.
есть ли простой способ применить патч из данной фиксации на данном файле к другому произвольному файлу в другом месте?
для бонусных баллов, что делать, если файл, к которому вы хотите применить патч, не находится в репозитории git?
8 ответов:
если о ручном редактировании файла патча не может быть и речи, это можно сделать с помощью стандартных опций (доступно в
git apply,git format-patchи GNUpatch).
-p<n>выводитnведущие каталоги из путей в патче.после обработки
-p,--directory=<root>добавляетrootдля каждого из путей в патче перед применением.пример
так, для вашего примера, чтобы взять патч, который был первоначально на
static/playdar.jsи применить его кlib/playdar.js, ты бы побежал:$ cat patch_file | git am \ -p1 \ # remove 1 leading directory ('static/') --directory='lib/' # prepend 'lib/'
патч произведен
git format-patchэто просто текстовый файл-- вы можете редактировать заголовки diff, чтобы он изменял другой путь.так, например, он выдавал что-то вроде этого:
diff --git a/lib/playdar.js b/lib/playdar.js index 1234567..89abcde -- a/lib/playdar.js ++ b/lib/playdar.jsвсе, что вам нужно сделать, это изменить
lib/playdar.jsдоstatic/playdar.jsа затем запустить патч черезgit am"патч должен быть читаем стандартной утилитой GNU patch для людей, у которых нет
git--- но не работатьformat-patchС-M,-Cтак далее. опции для создания переименования патчей в этом случае, потому что поддержка для них не является универсальной.
предполагая, что оба проекта являются проектами git, это звучит так подмодулей будет идеально подходит для вас. Это позволяет проекту git динамически связываться с другим проектом git, по существу выпекая git repo прямо внутри другого git repo, оба из которых имеют свои собственные жизни.
другими словами, добавьте "основное РЕПО" в качестве подмодуля в "проект". Всякий раз, когда вы совершаете/нажимаете новые вещи в "главном РЕПО", вы просто
git pullих обратно в "проект".
завершить ответ Хенрика, и идти за бонусным очком
что делать, если файл, к которому вы хотите применить патч, не находится в репозитории git?
Если у вас есть доступ к каталогам кандидата в файл для патча идет из репозитория Git, вы можете сначала преобразовать это дерево каталогов/файлов в Git-репозиторий! ( '
git init': репозиторий git-это просто a .ГИТ в корневой каталог, после всех).
Затем вы бы установили это РЕПО в качестве подмодуля для вашего основного проекта.
вы можете добавить новый пульт и вытащить из него. статья с подробностями.
$ cd <path-to-repoB> $ git remote add repoA <git-URL-for-repoA> $ git pull repoA
вы можете просто временно удалить (переименовать) основной репозиторий.
cd to/main/project mv .git .git_ cd to/sub/project git apply patchname cd - mv .git_ .git
С помощью до
format-patchможно улучшить абстракцию (скрыть несущественные сведения о репозитории, из которого был сгенерирован патч).[repository-with-changes] git format-patch --relative=(path-to-library) (base-commit-for-patch) ## 'HEAD~1'Я нашел
--3wayопция, которая требуется при применении патча (чтобы избежатьdoes not exist in indexошибка) - ваш пробег может варьироваться. Используя--directory=(...)вероятно, необходимо только в том случае, если ваш целевой путь не является корнем репозитория.[repository-to-update] git am --3way --directory=(path-to-library) (patch-file)
format-patchсоздать один патч файл для фиксации в текущей ветви с момента "base".документация Кажется в некоторых случаях, но он, кажется, работает в любом случае (начиная с версии 2.7.4).
Comments