Git funktioniert nicht mit .png-Dateien?

7

Ich habe einen schmutzig arbeitenden Baum, schmutzig, weil ich Änderungen an den Quelldateien vorgenommen und einige Bilder verändert habe. Ich habe versucht, nur die Bilder zum Index hinzuzufügen, also habe ich diesen Befehl ausgeführt:

%Vor%

Aber das fügt die Dateien nicht hinzu. Es gab ein paar neue Bilddateien, die hinzugefügt wurden, aber keine von denen, die modifiziert / bereits existierten, wurden hinzugefügt.

Was gibt's?

Bearbeiten : Hier finden Sie einige relevante Terminalausgaben

%Vor%

Dann ausgeführt "git add * .png" (keine Ausgabe nach dem Befehl)

Dann:

%Vor%     
DLaw 24.05.2010, 19:58
quelle

5 Antworten

15

Michael Mrozeks Kommentar ist im Wesentlichen die Antwort. *.png vergleicht Dateien dieses Namens im aktuellen Verzeichnis, nicht in Unterverzeichnissen. Wenn Sie Einsen in einem Unterverzeichnis hinzufügen möchten, tun Sie dies:

%Vor%

Je nach Ihrer Shell können Sie auch Folgendes tun:

%Vor%

Der Punkt ist, dass es die Shell ist, die das Globbing durchführt (expandiert * .png in eine Liste von Dateinamen). Git hat damit nichts zu tun; es nimmt nur die Argumente, die die Shell gibt es.

Bearbeiten: Da dies akzeptiert wurde, sollte ich weitermachen und darauf hinweisen, dass einige git-Befehle globbing intern unterstützen (via fnmatch). Wenn Sie also ein glob-Muster angeben, wird es unverändert von die Shell zu git, wo die Globbing-Erweiterung stattfinden wird.

    
Cascabel 24.05.2010, 20:21
quelle
10

Einige der Befehle von Git (einschließlich git add ) können Dateinamenmuster selbst verarbeiten. Aber zuerst müssen Sie sicherstellen, dass das Muster zu Git kommt.

Im Allgemeinen können nicht-quoted Muster es nicht zu dem aufgerufenen Befehl machen. Wenn das Muster keinen Dateien entspricht (im aktuellen Verzeichnis, wenn im Muster kein Schrägstrich vorhanden ist), wird bash das nicht erweiterte Muster an den Befehl übergeben (sofern die Option nullglob nicht aktiviert ist) set, in diesem Fall wird das Musterargument aus den an den Befehl übergebenen Argumenten gelöscht. Aber das Verhalten variiert zwischen den Schalen. Standardmäßig gibt zsh einen Fehler wie "no matches found" aus, es sei denn, die Option nomatch ist nicht gesetzt (übergibt das nicht erweiterte Muster als Argument) oder die Option null_glob (setzt das Muster aus) die Liste der Argumente).

Die Verwendung nichtquoted Muster und die Erwartung, dass sie zum zugrunde liegenden Befehl gelangen, ist nur dann zuverlässig, wenn Sie das Verhalten Ihrer Shell kennen und den Inhalt aller im Muster angegebenen Verzeichnisse kennen (normalerweise nur das aktuelle Verzeichnis für Muster ohne Schrägstrich) ).

Wenn Sie also git add für die maximale Zuverlässigkeit die literale Zeichenfolge *.png als Argument erhalten möchten, sollten Sie sie angeben.

%Vor%

Sobald Sie erfolgreich ein Dateinamensmuster an Git übergeben haben, werden Sie einige Unterschiede feststellen, wie Shells sie handhaben.

Der hauptsächliche Unterschied in dieser Frage besteht darin, dass der Abgleich von fnmatch (3) ohne FNM_PATHNAME festgelegt. Das bedeutet, dass ein Muster wie *.png mit einer Datei foo.png im aktuellen Verzeichnis übereinstimmt (genau wie eine Shell), aber auch dir/bar.png (weil ohne FNM_PATHNAME * mit dem Schrägstrich übereinstimmen kann). Git nennt seine Muster "pathspecs", um sie von Shell "glob" -Mustern zu unterscheiden.

Leider gibt es eine Inkonsistenz in der Art und Weise, wie git add Pfadangaben verarbeitet. Sie wendet sie immer auf nicht verfolgte Dateien an, aber sie wendet sie nie auf nachverfolgte Dateien an (stattdessen werden Argumente vom Typ "Dateiname" wie "Pfadangaben" nur auf exakte Übereinstimmungen mit der Liste der verfolgten Dateien überprüft). Dies ist anscheinend genau das, was das OP tatsächlich erreicht hat, da es neue Dateien hinzufügen würde, die mit der Pfadangabe übereinstimmen, aber (bereits) nachverfolgte Dateien, die der Pfadangabe entsprechen, nicht aktualisieren könnten.

Jefromis Workaround ( git add **/*.png ) funktioniert so lange, wie Ihre Shell das erweiterte Muster ** (oder ein Äquivalent) unterstützt.

Du kannst tatsächlich Git dazu bringen, die Arbeit zu machen, aber die Shell zu benutzen ist wahrscheinlich einfacher (wenn deine Shell es unterstützt).

%Vor%

Glättung Git's interne Pfadangabe ist ein "mittelfristiges" Ziel, aber keins, dass jemand mit der Zeit, dem Interesse und der relevanten Erfahrung zur Lösung gekommen ist.

Es wurde als Projektidee für Google Summer of Code 2010 aufgegriffen (nicht ausgewählt (und irgendjemandem), und ähnliche Probleme tauchen ab und zu auf der Mailing-Liste auf. (Im Januar und wieder im März 2010 hat jemand berichtet, dass er ein Symptom, das dem OP sehr ähnlich ist , Gitarristen erklärt, was er tut möchte auf lange Sicht sehen ).

    
Chris Johnsen 25.05.2010 05:01
quelle
1

Versuchen Sie im Zweifelsfall:

%Vor%

, das möglicherweise umfassender ist ( git add man-Seite )

%Vor%
  

Wie -u , aber passen Sie <filepattern> gegen Dateien in der Arbeitsbaumstruktur zusätzlich zum Index an.
  Das bedeutet, dass neue Dateien gefunden werden und geänderter Inhalt bereitgestellt wird und Dateien entfernt werden, die sich nicht mehr im Arbeitsbaum befinden.

Siehe SO-Frage " Differenz von" git add -A "und" git add . ""

    
VonC 24.05.2010 20:07
quelle
0

Die Groß- und Kleinschreibung von Dateisystemen wie Mac OS X wird ebenfalls verheerend sein. Wenn Sie "Verzeichnis" in "Verzeichnis" ändern, wird git sie nicht erkennen, es sei denn, Sie wechseln in einen anderen temporären Ordner, Commit, Zurück und Commit erneut.

    
Cameron Lowell Palmer 26.01.2011 15:13
quelle
0

git ls-files ist eine gute Möglichkeit, alles in Ihrem Git Repo aufzulisten

Für Ihren Fall können Sie etwas wie

tun %Vor%

Listen Sie die modifizierten Dateien auf, filtern Sie nach Erweiterung (in diesem Fall .png) und git fügen Sie die resultierenden Einträge hinzu

    
Ram 13.04.2012 05:03
quelle

Tags und Links