2015-01-22 11 views
5

Come in questione, se voglio annullare le modifiche nella directory di lavoro corro comando git checkout -- * ma git restituisce informazioni error: pathspec 'databaseName.tmp' did not match any file(s) known to git.. Non sono un vero maestro e non so come risolverlo. Qualche idea?"checkout git - *" restituisce "errore: pathspec non ha prodotto alcun file noti a git"

+0

Avete qualche file non monitorate nella directory di lavoro? – genisage

+0

Sì, ne ho alcuni. – pepuch

+1

Questo è il tuo problema, non puoi controllare un file non tracciato dall'indice. Quindi invece di un semplice '*' è necessario elencare solo i file che si desidera effettivamente estrarre. – genisage

risposta

15

Come genisagenoted in a comment, si sta chiedendo git esplicitamente per estrarre il file databaseName.tmp, come se avessi digitato:

git checkout -- databaseName.tmp 

Questo perché il * digitato in è gestito dalla shell, prima che Git abbia mai la possibilità di vedere il tuo comando. La shell sostituisce * con tutti i nomi dei file nella directory di lavoro corrente, e poi Fatto questo, poi piste git, senza alcuna indicazione che il comando effettivo immesso aveva * in esso, piuttosto che tutti quei nomi.

Anche in questo caso, git non ha idea che si è utilizzato l'asterisco * carattere, tutto ciò che vede è una lista di nomi di file, tra cui file ignorati qualsiasi livello superiore che sono non essere memorizzati in git.

Confusamente, se si riesce in qualche modo per passare un asterisco letterale * a git, git amplierà la *, ma con un diverso set di nomi di file: quelli noti a git. Quello farebbe quello che vuoi.

C'è un modo più semplice, però: git controllerà le directory ricorsivamente controllando tutti i file che conosce in quella directory. Così, invece di usare *, è sufficiente utilizzare . chiedere git di controllare la directory corrente:

git checkout -- . 

Se git conosce ./a e ./b ma non ./databaseName.tmp, questo sarà controllare ./a e ./b e non tentare di fare qualsiasi cosa con ./databaseName.tmp.


Più precisamente, i file i cui nomi non iniziano con un punto iniziale ..

E in effetti, è abbastanza facile da gestire, ad esempio, è sufficiente inserire un backslash \ davanti alla asterisco: git checkout -- \*. Oppure, usa virgolette singole o doppie, entrambe protette contro il globbing della shell. Le virgolette singole inibiscono anche l'espansione della variabile di shell, mentre le virgolette doppie consentono l'espansione variabile ma inibiscono il globbing.

Vale la pena sottolineare una sottile differenza qui: * espande ai nomi dei file che non iniziano con ., chiedendo git di controllare . induce a controllare tutti i file nella directory, compresi quelli i cui nomi iniziano con ..Quindi sia git checkout -- \* e git checkout -- * sarà non annullare le modifiche in un file denominato .secret, per esempio, mentre git checkout -- .sarà annullare tali modifiche.

+0

Volevo solo notare che funziona anche con i percorsi. Se sei nella root del tuo repository puoi fare 'git checkout - path/to/files/.' per ripristinare tutti i file in quella directory. – BrianVPS

Problemi correlati