Mam dwa repozytoria, jedno jest głównym repozytorium dla biblioteki, a drugie to projekt korzystający z tej biblioteki.
Jeśli naprawię w podległym projekcie, chciałbym mieć łatwy sposób na zastosowanie tej poprawki z powrotem w górę.
Lokalizacja pliku jest inna w każdym repozytorium.
- Główne repozytorium:
www.playdar.org/static/playdar.js
- Projekt:
playlick.com/lib/playdar.js
Próbowałem użyć git format-patch -- lib/playdar.js
w projekcie listy odtwarzania, a następnie git am
w głównym repozytorium playdar, ale różne lokalizacje plików w pliku poprawki powodowały błąd.
Czy istnieje łatwy sposób na zastosowanie łatki z danego zatwierdzenia w danym pliku do innego dowolnego pliku w innym miejscu?
Jeśli chodzi o punkty bonusowe, co jeśli plik, do którego chcesz zastosować poprawkę, nie znajduje się w repozytorium git?
git
patch
git-submodules
git-patch
James Wheare
źródło
źródło
Odpowiedzi:
Jeśli ręcznie edytując plik Patch jest wykluczone lub niewykonalne, można to zrobić za pomocą standardowych opcji (dostępne w
git apply
,git format-patch
i GNUpatch
).-p<n>
usuwan
wiodące katalogi ze ścieżek w łatce.Po przetworzeniu
-p
,--directory=<root>
poprzedzaroot
do każdej ścieżki w plastra przed zastosowaniem.Przykład
Tak więc, na przykład, aby pobrać poprawkę, która była pierwotnie włączona
static/playdar.js
i zastosować jąlib/playdar.js
, uruchomisz:źródło
--directory
: stackoverflow.com/questions/24121709/ ...Łatka utworzona przez
git format-patch
jest po prostu plikiem tekstowym - możesz edytować nagłówki różnic, tak aby modyfikowały inną ścieżkę.Na przykład dałoby to coś takiego:
Wszystko co musisz zrobić, to zmiana
lib/playdar.js
nastatic/playdar.js
a następnie uruchom patcha przezgit am"
Plaster powinien być odczytywany przez standardowe narzędzia GNU poprawki dla ludzi, którzy nie mają
git
--- ale nie działająformat-patch
z-M
,-C
itp opcji do produkcji plastrów przemianowania w tym przypadku, ponieważ wsparcie dla nich nie jest uniwersalna.źródło
Zakładając, że oba projekty są projektami git, wygląda na to, że submoduły byłyby dla Ciebie idealne. Pozwala to projektowi git dynamicznie łączyć się z innym projektem git, zasadniczo wypalając repozytorium git bezpośrednio w innym repozytorium git, oba mają własne, odrębne życie.
Innymi słowy, dodaj „repozytorium główne” jako moduł podrzędny w „projekcie”. Za każdym razem, gdy zatwierdzasz / wysyłasz nowe rzeczy w „głównym repozytorium”, po prostu umieszczasz
git pull
je z powrotem w „projekcie”.źródło
playdar.js
plik następnie m.in., że w obu pozostałych projektów (nie chcę od wszystkiego innegowww.playdar.org
wplaylick.com
projekcie) może po prostu uciec się do ręcznego edytowania plików patch do teraz, aby być uczciwym . Lub kontynuuj kopiowanie wklejania między nimi. Twoje zdrowie.Uzupełnienie odpowiedzi Henrika i zdobycie dodatkowego punktu
Jeśli masz dostęp do katalogów pliku kandydata na łatkę pochodzącego z repozytorium git, możesz najpierw przekształcić to drzewo katalogów / plików w samo repozytorium git! ('
git init
': repozytorium git to po prostu .git w katalogu głównym).Następnie ustawisz to repozytorium jako podmoduł dla swojego głównego projektu.
źródło
Użycie
--relative
opcjiformat-patch
może poprawić abstrakcję (ukryć nieistotne szczegóły repozytorium, z którego łatka została wygenerowana).Znalazłem
--3way
opcję, która jest wymagana podczas nakładania łatki (aby uniknąćdoes not exist in index
błędu) - Twój przebieg może się różnić. Użycie--directory=(...)
jest prawdopodobnie konieczne tylko wtedy, gdy ścieżka docelowa nie jest katalogiem głównym repozytorium.format-patch
utworzy jeden plik łatki na każde zatwierdzenie do bieżącej gałęzi od 'base'.--relative
Wydaje się, że w niektórych przypadkach brakuje dokumentacji tej opcji , ale wydaje się, że i tak działa (od wersji 2.7.4).źródło
Możesz dodać nowego pilota i wyciągnąć z niego. Artykuł ze szczegółami.
źródło
Możesz po prostu tymczasowo usunąć (zmienić nazwę) główne repozytorium.
źródło
Myślę, że poddrzewo jest najlepszym rozwiązaniem Twojego problemu
Samouczek 1
Tuorial 2
źródło