2012-08-15 6 views
7

hinzuzufügen Ich möchte eine Datei hinzufügen, die einen eindeutigen Dateinamen hat aber einen langen vorhergehenden Pfad (z. B. a/b/c/d/Dateiname.java). Normalerweise würde ich dies meinem Repository hinzufügen, indem ichMit zwei Sternchen, um eine Datei in git

git add *filename.java.

Allerdings habe ich dies auch zuvor getan:

git add *filename*

aber das tut etwas seltsam:

git add a/b/c/d/filename*

Also habe ich die beiden zu verbinden versucht. Es fügt jede nicht verfolgte Datei hinzu. Ich kann mögliche Gründe für einen Fehler sehen, aber sie sollten alle in einem der beiden vorherigen Befehle auftreten, weshalb ich nicht weiß, warum das passiert.

Meine Frage ist nicht so sehr darüber, wie man eine Datei zu einem Git-Repository nur mit seinem Dateinamen hinzufügen (obwohl das nützlich wäre). Meine Frage ist, was ist mein Missverständnis der * Operation, die mich denken, dass das oben genannte funktionieren sollte.

Info:

ich Git Bash for Windows verwende, die auf minGW basiert.

+0

Ist der Dateiname, den Sie tatsächlich verwendeten, der String 'filename' oder verwenden Sie das als Beispiel? – Hogan

+0

Das ist nur ein Beispiel. – Paul

+0

Wenn Sie sich auf den letzten Befehl beziehen, ist das nicht der Fall. Tatsächlich denke ich, dass das Gegenteil passiert: Es passt alles zusammen. Wenn ich 'git add' gebe, wird nichts hinzugefügt. – Paul

Antwort

9

Sie suchen globs (nicht reguläre Ausdrücke, die eine andere Muster-Matching-Sprache sind), und sie werden von Ihrer Shell, nicht von Git erweitert.

Wenn Sie sehen möchten, wie sie übereinstimmen, übergeben Sie den gleichen Glob nur an einen anderen Befehl, z.

$ ls -d *filename.java 

vs

$ ls -d *filename* 

(Ich habe soeben die -d so hat ls nicht den Inhalt aller Verzeichnisse zeigen, die passen)


Da Sie git verwenden Bash, und es ist möglich, dass sich die Glob-Erweiterung anders verhält als eine normale Shell, versuchen Sie

$ git add --dry-run --verbose -- *filename* 

zum Beispiel: Dies sollte Ihnen zeigen, wie es wirklich den Glob erweitert und welchen Effekt das hat.

Notiere die -- ... wenn Sie Klackse verwenden, die einen Dateinamen mit einem führenden - passen könnte, ist es wichtig, um sicherzustellen, dass git weiß, dass es ein Dateiname ist und keine Option.

Leider zeigt dies nur die Dateien, die beide den Glob übereinstimmen, und haben einen Unterschied zwischen dem Index und Arbeitskopie.


Antwort des Autors: Der Trockenlauf sehr geholfen, hier ist das, was ich gefunden habe:

ich vergesse über den Ordner ist, die ich nicht hinzugefügt, so, wenn ich die durchgeführt Ich habe festgestellt, dass es zwei Übereinstimmungen gibt: filename.java und filename.class. Als ich den Glob zu *filename.j* änderte, funktionierte es.

Mein nächster Schritt war, die .class zu entfernen und den Befehl erneut zu versuchen: es hat funktioniert! Es ist noch ungeklärt, warum git bash alles hinzugefügt hat, als es zwei Übereinstimmungen gefunden hat ... da sich der trockene Lauf anders verhält als der tatsächliche Lauf, denke ich, dass es einen Fehler geben muss, aber ich denke, dass die Diskussion woanders stattfinden muss (außer jemand denkt es ist kein Fehler).

+0

Interessanterweise gibt mir das unterschiedliche Ergebnisse. Also heißt das, Git evaluiert es? – Paul

+0

Git kann es nicht bewerten, Globing passiert, bevor Git ausgeführt wird (in allen Shells, die ich kenne) – Hogan

+0

Das könnte das Problem sein: Ich benutze Git Bash, die eine Git-Shell für Windows ist (die ich denke minGW verwendet). Ich werde das zu meinem ersten Beitrag hinzufügen. – Paul

Verwandte Themen