2012-08-15 13 views
7

Desidero aggiungere un file con un nome file univoco ma un percorso precedente lungo (ad es. A/b/c/d/nomefile.java). Normalmente lo aggiungerei al mio repository facendoUtilizzo di due asterischi per aggiungere un file in git

git add *filename.java.

Tuttavia ho anche fatto prima:

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

così ho cercato di combinare le due cose:

git add *filename*

ma questo fa qualcosa di strano. Aggiunge tutti i file non tracciati. Riesco a vedere i possibili motivi di errore, ma dovrebbero tutti verificarsi in uno dei due comandi precedenti, quindi non so perché questo sta accadendo.

La mia domanda non è tanto su come aggiungere un file a un repository git con solo il suo nome file (anche se sarebbe utile). La mia domanda è qual è il mio fraintendimento dell'operazione * che mi fa pensare che quanto sopra dovrebbe funzionare.

Info:

Sto usando Git Bash for Windows, che si basa su minGW.

+0

Il nome del file che stavi utilizzando è effettivamente la stringa 'filename' o stai usando questo come esempio? – Hogan

+0

Questo è solo un esempio. – Paul

+0

Se ti riferisci all'ultimo comando, allora quello non sta succedendo. In effetti penso che stia accadendo l'opposto: è l'abbinamento di tutto. Se digito 'git add', non viene aggiunto nulla. – Paul

risposta

9

Stai guardando globs (non espressioni regolari, che sono un diverso linguaggio di corrispondenza del modello), e sono espanse dalla tua shell, non da git.

Se vuoi vedere come stanno andando a corrispondere, basta passare lo stesso glob a un altro comando, ad es.

$ ls -d *filename.java 

vs

$ ls -d *filename* 

(Ho appena aggiunto il -d modo ls non mostra il contenuto di qualsiasi directory che corrispondono)


Dal momento che si sta utilizzando git bash, ed è possibile che l'espansione glob si comporti diversamente da una shell regolare, prova

per esempio: questo dovrebbe mostrarti come espande realmente il glob e quale effetto ha.

Annotare il -- ... se si sta utilizzando gocce che potrebbe abbinare un nome di file con un leader -, è importante assicurarsi che git sa che è un nome di file e non è un'opzione.

Sfortunatamente, questo mostrerà solo i file che corrispondono al glob e hanno una certa differenza tra l'indice e la copia di lavoro.


Risposta da autore: Il funzionamento a secco ha aiutato molto, qui è quello che ho trovato:

dimenticavo sulla cartella bin che non ho aggiunto, in modo che quando ho eseguito il A secco ho capito che stava trovando due match: filename.java e filename.class. Quando ho cambiato il glob a *filename.j* ha funzionato.

Il mio prossimo passo è stato rimuovere la .class e riprovare il comando: ha funzionato! È ancora inspiegabile perché git bash ha aggiunto tutto quando ha trovato due fiammiferi ... poiché il dry run si comporta diversamente dalla corsa effettiva, penso che ci debba essere un bug, ma penso che la discussione debba essere tenuta altrove (a meno che qualcuno la pensi non è un bug).

+0

È interessante notare che questo mi dà risultati diversi. Quindi questo significa che Git lo sta valutando? – Paul

+0

Git non può valutarlo, Globing accade prima che Git venga eseguito (in tutte le shell che conosco) – Hogan

+0

Questo potrebbe essere il problema: sto usando Git Bash che è una shell Git per Windows (che penso usi minGW). Lo aggiungerò al mio primo post. – Paul

Problemi correlati