Pytanie w sprawie git – Wykluczanie plików z git-diff

60

Śledzę projekt za pomocą git. W kopii roboczej znajduje się kilka plików projektu Xcode, które chcę śledzić, ale nie chcę widzieć w plikach różnicowych, ponieważ zawsze są dziesiątki zmienionych linii, które nigdy mnie nie interesują. Czy istnieje prosty sposób na uzyskaniegit-diff Pomiń te pliki? Próbowałem skonfigurować niestandardowe „ciche” narzędzie do porównywania:

$ cat .gitattributes 
Project.xcodeproj/* diff=nodiff

$ cat ~/.gitconfig 
[diff "nodiff"]
    command = /bin/true

Ale:

$ git diff
external diff died, stopping at Project.xcodeproj/zoul.mode1v3.

Co ja robię źle?

Twoja odpowiedź

4   odpowiedź
7

Możesz użyć aliasu w .git / config

<code>[alias]
        mydiff = !git diff | filterdiff -x "*/Project.xcodeproj/*"
</code>

Do tego triku potrzebujesz filterdiff (z patchutils).

<code>sudo apt-get install patchutils
</code>

Mimo to diff nie jest doskonały, pozostawia trochę śmieci:

<code>[email protected]:~/git-filter-test$ git mydiff
diff --git a/Project.xcodeproj/dummy.txt b/Project.xcodeproj/dummy.txt
index 3e1f9e6..89dfed9 100644
diff --git a/dummy2.txt b/dummy2.txt
index 91966ce..d9588a9 100644
--- a/titi.txt
+++ b/titi.txt
@@ -1,3 +1,3 @@
 aaaaaaaaaa
-bbbbbbbbb
 cccccc
+ddd
</code>
To bardzo miłe, dziękuję. Śmieci są w porządku, przynajmniej wiem, że te pliki się zmieniły. Ale tracę kolorystykę, czy jest jakiś sposób, żeby go odzyskać? Próbowałem git diff --color, aby go wymusić, ale potem filterdiff zostaje zdezorientowany przez ucieczki kolorów i zatrzymuje filtrowanie. zoul
Dziękujemy za odpowiedzi na to pytanie - filterdiff prawie odpowiada moim potrzebom - jednak „śmieci”, które pozostały, sprawiają mi kłopoty - czy można powiedzieć „całkowicie usunąć wszystkie odniesienia do pliku” za pomocą filterdiff? Michael
O tak, | colordiff | mniej -r. zoul
85

Problemem jest/bin/true powróci natychmiast bez czytania jego wejścia.git diff uważa zatem, całkiem rozsądnie, że zmarł przedwcześnie.

To, co naprawdę chcesz zrobić, to usunąć atrybut diff, a nie ustawić fałszywe polecenie. Spróbuj tego w swoim.gitattributes:

<code>Project.xcodeproj/* -diff
</code>
Jeśli chcesz również wykluczyć podkatalogi, zrób toProject.xcodeproj/**/* -diff zamiast. tomekwi
Nie zapobiega również przetwarzaniu przez zewnętrzne diff (może być częściowo dlatego, że traktuje go teraz jako binarny zamiast ignorować) Steven Lu
Używam Git 1.9.4 i dodam-diff teraz sprawia, że ​​diff przetwarza pliki, które chcę wykluczyć jako pliki binarne, zamiast ich ignorować ... slaadvak
Tak, to działa dobrze, bardzo dziękuję. zoul
7

Kolejne rozwiązanie, które wytwarza czyste wydruki bez zewnętrznych narzędzi (dodaj do.git/config):

<code>[alias]
    mydiff = !git diff -- $(git diff --name-only | grep -Ev "Project.xcodeproj/")
</code>

Następnie uruchom go za pomocą:

<code>git mydiff
</code>

Zauważ, żegit diff --name-only jest lepszy niżgit ls-files ponieważ przekaże krótszą listę plików dogit diff, ponieważ tylko pliki, które są zmodyfikowane, zostaną uwzględnione. Wystąpiły problemy z przekroczeniem maksymalnej liczby argumentów w dużych projektach podczas używaniagit ls-files.

Wpadłem na problemy ze skomplikowanymi ścieżkami. Podejrzewam, że byłoby lepiej, gdybyś użył przełącznika -z: „nie mieszaj nazw ścieżek i używaj NUL jako terminatorów pól wyjściowych”. Ben Creasy
0

Po prostu okłamuj kogoś innego z takim samym bólem jak my. Chcieliśmy wykluczyć plik, który został już zatwierdzony.

Ten post był o wiele bardziej użyteczny:Praca z .git / info / exclude za późno

W szczególności należy zignorować plik, używając polecenia git remove Seegit rm (http://www.kernel.org/pub/software/scm/git/docs/git-rm.html)

testujesz to, przechodząc

git rm --dry-run *.log
(jeśli powiesz, że chcesz wykluczyć wszystkie pliki dziennika)

spowoduje to wyjściebyłoby wykluczone, jeśli go uruchomiłeś.

następnie

uruchamiasz go, wchodząc

git rm *.log
(lub dowolną ścieżkę / wyrażenie nazwy pliku)

Powiązane pytania