Создание файла патча из 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
будет делать то, что вы хотите.