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.
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.
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.
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
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.
Powinieneś chyba patrzeć na git rebase
. Być może nawet prosty git pull
zrobi to, co chcesz.
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