Как применить git патч из одного репозитория в другой?



у меня есть два репозитория, один из которых является основным РЕПО для библиотеки, а другой-проект, использующий эту библиотеку.



если я сделаю исправление в подчиненном проекте, я хотел бы простой способ применить этот патч обратно вверх по течению.



расположение файла отличается в каждом репозитории.




  • Главная РЕПО: www.playdar.org/static/playdar.js

  • : playlick.com/lib/playdar.js


Я пробовал использовать git format-patch -- lib/playdar.js в проекте playlick, а затем git am на основном РЕПО playdar, но разные местоположения файлов в файле патча вызвали ошибку.



есть ли простой способ применить патч из данной фиксации на данном файле к другому произвольному файлу в другом месте?



для бонусных баллов, что делать, если файл, к которому вы хотите применить патч, не находится в репозитории git?

1002   8  

8 ответов:

если о ручном редактировании файла патча не может быть и речи, это можно сделать с помощью стандартных опций (доступно в git apply,git format-patch и GNU patch).

  1. -p<n> выводит n ведущие каталоги из путей в патче.

  2. после обработки -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

Я думаю, что поддерево является лучшим решением для вашей проблемы

Урок 1

Tuorial 2

вы можете просто временно удалить (переименовать) основной репозиторий.

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

    Ничего не найдено.