Создание файла патча из diff двух папок - PullRequest
35 голосов
/ 17 марта 2010

Я внес некоторые изменения в проект с открытым исходным кодом, не тратя время на создание правильных файлов исправлений.

Теперь сопровождающий проекта выпустил новую версию, и среди новых и отредактированных файлов есть куча переименованных файлов.

Какой лучший способ применить мои изменения к новой версии?
Я совершенно новичок в использовании diff / patch, и если я смогу сделать это с помощью git, было бы лучше.

Ответы [ 5 ]

50 голосов
/ 17 марта 2010

Если у вас есть два одинаковых каталога a и b, и вы хотите, чтобы b совпадал с a, вы можете создать и применить патч с помощью:

$ diff -ur b a > ba.diff
$ patch -i ba.diff

Предположим, у вас есть каталоги local (содержащие вашу локальную версию upstream1.0), upstream1.0 и upstream1.1. Чтобы создать и применить ваши изменения к upstream1.1:

$ diff -ur upstream1.0 local > my.diff
$ cd upstream1.1
$ patch -i ../my.diff 

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

10 голосов
/ 17 марта 2010

Если проект находится в git и вы не зафиксировали свои изменения локально, вы можете просто сделать git diff > file.patch, чтобы получить патченные данные сравнения.Если вы зафиксировали изменения локально, вы можете сделать git log, чтобы найти фиксацию перед вами, а затем git diff commit_string > file.patch.

Если проект не находится в git или если вы используете d / l source без клонированиярепозиторий (как следует из заголовка), вы можете использовать diff -urN original_dir new_dir > file.patch для создания файла патча.В обоих случаях вы можете попробовать использовать patch позже, чтобы применить исправление.

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

4 голосов
/ 17 марта 2010

Git поддерживает обнаружение переименования файлов, поэтому, если вам повезет, он поможет вам в этом. Ниже приведен примерный проект того, что вы должны сделать.

Импорт оригинальной версии:

tar zxvf open-source-project-0.1.tar.gz 
mv open-source-project-0.1 open-source-project
cd open-source-project
git init
git add .
git commit -m "Initial checkin of open-source-project-0.1"
git tag open-source-project-0.1

Теперь вы можете применить свои оригинальные изменения в отдельной ветке:

git checkout -b mychanges
cp /somewhere/where/your/changes/files/are/* .
git diff
git add .
git commit -m "My changes"
git tag my_changes_001

Затем вы обновляетесь до более новой версии:

git checkout master
tar zxvf open-source-project-0.2.tar.gz 
mv open-source-project-0.2/* .
rmdir open-source-project-0.2
git add .
git commit -m "Update to open-source-project-0.2"
git tag open-source-project-0.2

Пока все проверено в репозитории git, сейчас самое время попытаться объединить ваши изменения:

git checkout -b merge_test open-source-project-0.2
git pull . my_changes_001

Удачи ...

Если вы хотите объединить файлы вручную, я настоятельно рекомендую использовать KDiff3 . Предполагая, что file1.c из open-source-project-0.1, file2.c из open-source-project-0.2 и file3.c из ваших изменений, запустите

kdiff3 -o merged_file.c file1.c file2.c file3.c
1 голос
/ 17 марта 2010

Вы можете попробовать кое-что из того, что мне было предложено здесь ранее, интересное «отличающееся» решение: сначала клонируйте последнюю версию проекта.Не должно быть никаких локальных изменений.Убедитесь, что папка .git есть.Затем скопируйте ваше рабочее дерево, то есть все ваши файлы, кроме папки .git, в клонированное хранилище.Теперь, если вы введете «git st», вы увидите все, что было изменено.Вам нужно будет также отсортировать интервалы и окончания строк (git config core.autocrlf ...), если git st сообщает о файлах, в которых нет изменений.

Теперь для каждого файла в gitЕсли вы введете git diff, вы увидите ваши изменения.

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

Я бы не сталне полагайтесь на исправления, потому что они очень требовательны.Скорее всего, вы получите «не применять патч», в то время как в приведенном выше решении вы найдете список неустановленных изменений, с которыми вы можете работать в любом порядке.

0 голосов
/ 30 августа 2017

Вероятно, вы должны смотреть на git rebase. Возможно, даже простой git pull сделает то, что вы хотите.

...