Tworzenie pliku łaty z różnicy 2 folderów

Wprowadziłem kilka zmian w projekcie open source, nie poświęcając czasu na tworzenie odpowiednich łatek.

Teraz opiekun projektu wydał nową wersję, a wśród nowych i edytowanych plików znajduje się kilka zmienionych plików.

Jaki jest najlepszy sposób na zastosowanie moich zmian do nowej wersji ?
Jestem zupełnie nowy w używaniu diff/patch, i jeśli uda mi się to zrobić z Gitem, byłoby lepiej.

Author: karatchov, 2010-03-17

5 answers

Jeśli masz dwa katalogi a i b, które są podobne i chcesz, aby b były takie same jak a, możesz utworzyć i zastosować łatkę za pomocą:

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

Załóżmy, że masz katalogi local (zawierające Twoją lokalną wersję upstream1.0), upstream1.0, i upstream1.1. Aby utworzyć i zastosować zmiany do upstream1.1:

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

Sprawdź dokumentację patcha i spróbuj przekonać opiekunów do używania Gita. Wszystko będzie o wiele prostsze, jeśli możesz używać narzędzi git do pracy z Twoje lokalne repozytorium.

 43
Author: William Pursell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-05 18:02:11

Jeśli projekt jest pod Gitem i nie zatwierdziłeś swoich zmian lokalnie, możesz po prostu zrobić git diff > file.patch, aby uzyskać łatkowalne dane różnicowe. Jeśli zatwierdziłeś zmiany lokalnie, możesz zrobić git log, aby znaleźć commit przed tobą i than git diff commit_string > file.patch.

Jeśli projekt nie jest pod git, lub jeśli d / l źródła Bez klonowania repozytorium( jak sugeruje tytuł), można użyć diff -urN original_dir new_dir > file.patch do utworzenia pliku patch. W obu przypadkach można spróbować użyć plastra później, aby nałożyć plaster.

Jednak należy rozważyć używanie narzędzi git do scalania zmian z nową wersją, ponieważ git jest w stanie śledzić również zmiany nazw plików. Będziesz musiał wiele nauczyć się o samym git, a poprawienie go zajmie ci trochę czasu - prawdopodobnie powinieneś wykonać kopię zapasową swojej pracy przed rozpoczęciem zabawy z nim.

 10
Author: niry,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-17 08:08:23

Git posiada wsparcie dla wykrywania zmiany nazw plików, więc jeśli masz szczęście, pomoże ci w tym. Poniżej znajduje się przybliżony szkic tego, co powinieneś zrobić.

Importuj oryginalną wersję:

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

Teraz możesz zastosować swoje oryginalne zmiany w oddzielnej gałęzi:

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

Następnie aktualizujesz do nowszej wersji:

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

Na razie wszystko jest sprawdzane w repozytorium git, teraz jest czas, aby spróbować scalić swoje zmiany:

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

Dobrze szczęście...

Jeśli chcesz ręcznie scalać pliki, naprawdę polecam użycie KDiff3. Zakładając plik 1.c pochodzi z open-source-project-0.1, file2.c z open-source-project-0.2 i file3.c z Twoich zmian, uruchom

kdiff3 -o merged_file.c file1.c file2.c file3.c
 4
Author: hlovdal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-17 10:19:49

Możesz spróbować czegoś, co zostało mi tu wcześniej zasugerowane, ciekawego "zróżnicowanego" rozwiązania: najpierw Sklonuj najnowszą wersję projektu. Nie powinno mieć żadnych lokalnych zmian. Upewnij się, że.folder git tam jest. Następnie skopiuj działające drzewo, czyli wszystkie pliki z wyjątkiem .folder git, do sklonowanego repo. Teraz jeśli wpiszesz "git st" zobaczysz wszystko, co zostało zmienione. Będziesz musiał uporządkować również odstępy i zakończenia linii (Git Config core.autocrlf ...) jeśli Git St zgłosi pliki, które tak naprawdę nie mają w sobie zmian.

Teraz dla każdego pliku z listy git st, jeśli wpiszesz git diff zobaczysz swoje zmiany.

Następnie edytowałbym pliki jeden po drugim, aż git st będzie wyglądał jak to, co chcę zatwierdzić.

Nie polegałbym na robieniu łatek, bo są bardzo wybredne. Najprawdopodobniej otrzymasz "nie można zastosować poprawki" , podczas gdy powyższe rozwiązanie daje listę nieakstragowanych zmian, nad którymi możesz pracować w dowolnej kolejności.

 1
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-17 09:50:27

Powinieneś chyba patrzeć na git rebase. Być może nawet prosty git pull zrobi to, co chcesz.

 0
Author: Tallak Tveide,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-30 13:34:05