Как применить diff между двумя файлами для повторного создания второго? [Дубликат]

Да, это , что плохо. Я считаю, что если вам не нравится использование реляционных баз данных, ищите альтернативу, которая вам подходит, есть много интересных проектов NOSQL с некоторыми действительно расширенными функциями.

65
задан mart1n 13 May 2013 в 16:58
поделиться

5 ответов

Вы можете создать патч, используя git diff , а затем применить его с помощью утилиты patch , которая позволяет вам указать файл, который вы хотите применить diff to.

Например:

cd first-repo
git diff HEAD^ -- hello.test > ~/patch_file

cd ../second-repo
patch -p1 blue/red/hi.test ~/patch_file
58
ответ дан georgebrock 20 August 2018 в 23:07
поделиться
  • 1
    Ах, хорошо, не думал об этом. Однако есть ли способ сделать это с помощью команд Git, чтобы данные фиксации (дата и время, фиксация автора, сообщение фиксации) сохранялись одинаково? – mart1n 13 May 2013 в 18:35
  • 2
    Возможно, есть что-то, что вы можете сделать с am или apply, но я не могу его найти. Если вы обнаружите, что вы много дублируете изменения, может быть лучшее решение, использующее подмодули, или независимо от того, какой ваш язык предлагает для совместного использования кода (например, в Ruby вы можете извлечь дубликат кода в качестве драгоценного камня). – georgebrock 13 May 2013 в 18:58
  • 3
    Это фактически связано с документацией (исходные файлы - это XML). Субмодули на самом деле не являются вариантом, так как я должен был бы обосновать их в нашей существующей инфраструктуре. – mart1n 13 May 2013 в 19:24

Существует простое решение, которое не требует ручного редактирования патчей и внешнего скрипта.

В первом репозитории (это может также экспортировать диапазон фиксации, используйте -1, если вы хотите выбрать только одно коммит):

git format-patch --relative <committish> --stdout > ~/patch

Во втором репозитории:

git am --directory blue/red/ ~/patch

Вместо использования --relative в git format-patch другое решение состоит в использовании опции -p<n> в git am для удаления n каталогов с пути патчей, как указано в a ответит на аналогичный вопрос .

Также можно запустить git format-patch --relative <committish> без --stdout, и он сгенерирует набор файлов .patch. Эти файлы затем могут быть поданы непосредственно на git am с помощью git am --directory blue/red/ path/to/*.patch.

27
ответ дан Community 20 August 2018 в 23:07
поделиться
  • 1
    Это все еще зависит от того, что имена файлов одинаковы, не так ли? – mart1n 30 April 2015 в 06:44
  • 2
    спас мой день :) – tuxinaut 5 May 2015 в 15:21
  • 3
    Следует отметить, что для параметра --directory требуется указать полный путь к каталогу относительно корня репо; что-то вроде --directory=./, а chdir'd в подкаталог в репо не будет работать. – Reid 2 August 2016 в 19:39
  • 4
    Использование --3way помогает с does not exist in index: git am --3way --directory (relative-path) (patch) – nobar 10 December 2017 в 01:32
  • 5
0
ответ дан Gqqnbig 20 August 2018 в 23:07
поделиться

Отвечая на мой собственный вопрос скриптом, который выполняет только это: https://github.com/mprpic/apply-patch-to-file

Вместо изменения файл исправления вручную, он запрашивает у пользователя целевой файл, изменяет патч и применяет его к репо, в котором вы сейчас находитесь.

7
ответ дан mart1n 20 August 2018 в 23:07
поделиться
1
ответ дан oliver 31 October 2018 в 18:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: