2013-05-13 11 views
50

Mam dwa repozytoria. W jednym wprowadzam zmiany do pliku ./hello.test. Zatwierdzam zmiany i tworzę łatę z tego zatwierdzenia z git format-patch -1 HEAD. Teraz mam drugie repozytorium, które zawiera plik o tej samej zawartości co plik hello.test, ale jest umieszczony w innym katalogu pod inną nazwą: ./blue/red/hi.test. Jak mam zamiar zastosować powyższą łatę do pliku hi.test? Próbowałem git am --directory='blue/red' < patch_file, ale oczywiście skarży się, że pliki nie mają tego samego imienia (które uważałem, że Git nie obchodzi?). Wiem, że prawdopodobnie mógłbym edytować różnicę, aby zastosować do tego konkretnego pliku, ale szukam rozwiązania polecenia.Jak zastosować poprawkę Git do pliku o innej nazwie i ścieżce?

+0

Związane z: https://stackoverflow.com/q/3367254/1959808 –

Odpowiedz

51

Można utworzyć poprawkę za pomocą git diff, a następnie zastosować ją za pomocą narzędzia patch, które pozwala określić plik, do którego chcesz zastosować różnicę.

Na przykład:

cd first-repo 
git diff HEAD^ -- hello.test > ~/patch_file 

cd ../second-repo 
patch -p1 blue/red/hi.test ~/patch_file 
+0

Ah, miłe, nie myślałem o tym. Czy jest jednak jakiś sposób, aby to zrobić za pomocą poleceń Git, aby dane zatwierdzenia (data i czas, autor zatwierdzający, komunikat zatwierdzenia) były takie same? – mart1n

+0

Jest możliwe, że jest coś, co możesz zrobić z 'am' lub' apply', ale nie mogę go znaleźć. Jeśli często powielacie zmiany, może istnieć lepsze rozwiązanie z wykorzystaniem podmodułów lub innego języka udostępnianego do udostępniania kodu (np. W Ruby można wyodrębnić duplikat kodu jako klejnot). – georgebrock

+0

W rzeczywistości jest to związane z dokumentacją (pliki źródłowe to pliki XML). Submodules nie są tak naprawdę opcją, ponieważ musiałbym przedstawić dla nich mocną argumentację w naszej istniejącej infrastrukturze. – mart1n

7

odpowiedzi na moje własne pytanie o skrypt, który robi tylko to: https://github.com/mprpic/apply-patch-to-file

Zamiast ręcznie modyfikując plik poprawki, to monituje użytkownika dla pliku docelowego, modyfikuje łatka i stosuje ją do repo, w którym aktualnie jesteś.

24

Istnieje proste rozwiązanie, które nie wymaga ręcznej edycji łatki ani zewnętrznego skryptu.

W pierwszym repozytorium (może także eksportować szereg popełnić użyć -1 jeśli chcesz wybrać tylko jeden commit):

git format-patch --relative <committish> --stdout > ~/patch 

W drugim repozytorium:

git am --directory blue/red/ ~/patch 

Zamiast z użyciem --relative w git format-patch, innym rozwiązaniem jest użycie opcji -p<n> w git am w celu usunięcia katalogów ze ścieżki poprawek, jak wspomniano w answer to a similar question.

Możliwe jest również uruchomienie git format-patch --relative <committish> bez --stdout, a wygeneruje on zestaw plików .patch. Pliki te można następnie przesłać bezpośrednio do git am z git am --directory blue/red/ path/to/*.patch.

+4

To nadal polega na tym, że nazwy plików są takie same, prawda? – mart1n

+0

zapisał mój dzień :) – tuxinaut

+1

Należy zauważyć, że opcja '--directory' wymaga podania pełnej ścieżki katalogu względem katalogu głównego repo; coś takiego jak '--directory = ./' podczas gdy chdir'd do podkatalogu w repozytorium nie będzie działać. – Reid

Powiązane problemy