2013-03-01 28 views
35

Was würde ich zu tun ist, wie eine einzelne Datei oder eine Reihe von Dateien mit einem gemeinsamen Namen Teil wie dieseGibt es eine Möglichkeit, Wildcards mit git checkout zu verwenden?

git checkout myBranch */myFile.md und

git checkout myBranch -- */*Test* (nicht sicher über den ‚-‘ Teil) zur Kasse

statt

git checkout myBranch src/main/java/a/deep/package/structure/myFile.md und

git checkout myBranch src/test/java/a/deep/package/structure/TestOne.java
git checkout myBranch src/test/java/a/deep/package/structure/TestTwo.java
git checkout myBranch src/test/java/a/deep/package/structure/resources/TestData.sql

Ich weiß, es gibt einige begrenzte Wildcard-Funktionalität für einige git Befehl wie diff und add aber haben nichts für checkout gefunden. Gibt es einen Weg?

EDIT: Ich benutze git 1.7.9.5 unter Linux. Eine funktionierende Kombination von git und shell commands wäre ebenfalls akzeptabel.

+0

Seltsam, 'git diff' scheinen keine Platzhalter für mich, obwohl' git add' zu unterstützen und 'commit' tun. – TankorSmash

Antwort

30

Git macht mit Wildcards umgehen, mit fnmatch(3). Siehe Pathspec Eintrag in Git glossary.

Aber um sicher zu sein, dass git die Platzhalter sehen kann, müssen sie geflutet werden, sonst wird Ihre Shell sie zuerst erweitern. Typischerweise ich Platzhalter zwischen einfachen Anführungszeichen verwenden:

git checkout myBranch -- '*/myFile.md' 

Die Platzhalter für den gesamten Namen angelegt werden, enthalten Verzeichnisse.

Wie Sie in der Dokumentation sehen können, erlaubt die Pathspec auch magische Signatur, die ändern, wie die Pathspec zu interpretieren. Sie können beispielsweise Groß-/Kleinschreibung bei Groß- und Kleinschreibung ignorieren, indem Sie icase eingeben (Sie können ':(icase)*readme*' eingeben, um alle Ihre Readme-Dateien zu finden).

Ich zitiere @ BamBams Kommentar hier, falls Sie Probleme in Windows haben:

Dies funktioniert für mich nicht in Windows mit 2.8.1.windows.1 und ich bin Git unter Verwendung von der cmd.exe shell so kein globbing eingebaut. Es gibt aber eine Lösung, wenn Sie in einem so traurigen Zustand sind.Kombinieren Sie git diff --name-only und xargs zu erreichen Ihr Ziel:

git diff --name-only <COMMIT> -- <GLOB>... | xargs git checkout <COMMIT> 
+1

Ein bisschen spät auf die Party, aber zweifellos richtig. Danke @coredump, Zeit, um das grüne Häkchen zu bewegen :) – kostja

+0

@kostja Ja, definitiv spät ;-) Danke – coredump

+1

Aber keine Möglichkeit, den Zweignamen, z. 'git checkout mein *'? – dumbledad

21

Git behandelt nicht den Platzhalter, aber Ihre Shell tut es.

Versuchen Sie folgendes:

git checkout myBranch **/myFile.md 

und

git checkout myBranch **/*Test* 

Mit dem **, Shell für Dateien in allen Unterverzeichnissen aussehen wird aus dem aktuellen Arbeitsverzeichnis gestartet wird.

+0

Funktioniert wie beschrieben. Vielen Dank Intrepidd – kostja

+6

Beachten Sie, dass _only_ Dateien berücksichtigt, die die Shell sieht, z. B. ausgecheckte Dateien. Es prüft _nicht_ Dateien, die nicht bereits vorhanden sind. – vonbrand

+0

@vonbrand: Gibt es einen Weg, dies mit Dateien zu tun, die im Commit sind, aber nicht im Dateisystem? – Gauthier

0

Keiner der anderen Antworten für mich gearbeitet, aber BamBams Kommentar gearbeitet. Ich habe es zu einer Bash-Funktion gemacht, die zwei Argumente akzeptiert. Verbrauch:

gitcheckout mybranch '* Datei *'

gitcheckout() 
{ 
    GIT_DIR=$(git rev-parse --git-dir 2>/dev/null); 
    pushd .; 
    cd $GIT_DIR/../; 
    git diff --name-only $1 -- $2 | xargs git checkout $1 --; 
    popd; 
} 
Verwandte Themen