Создание файла патча из diff двух папок

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

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

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

7 ответов

Решение

Если у вас есть две директории 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 для работы с вашим локальным репозиторием.

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

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

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

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

diff -uraBN upstream local > filename.patch
cd upstream
patch --dry-run -p1 -i filename.patch #highly recommended recommended
patch -p1 -i filename.patch

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

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

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

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

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

      Folder 1: 
 index1.html
 css/style.css
 js/

Folder 2:
 index1.html
 index2.html
 css/style.css
 js/

Теперь мы хотим сравнить две папки и каталоги. В CSS изменено.

В другой index2.htmlдобавлен. Теперь мы хотим отличить от html2к html1

$ git diff html2/ html1/ > patches/htmlchanges.patch

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

Другие вопросы по тегам