2012-01-12 14 views
5

Sto utilizzando Git da solo per il mio progetto software locale in Visual Studio 2010. Recentemente ho creato un nuovo ramo per eseguire un refactoring più grande di una finestra di dialogo . Ho fatto le seguenti modifiche:Errore Git irrisolvibile: i seguenti file dell'albero di lavoro non tracciati verrebbero sovrascritti dal checkout

  • rinominare Form1 per Form1a (inclusi tutti i file a seconda)
  • Aggiungi nuova Form1

ho controllato questo cambiamento nel ramo, per esempio sotto forma-refactoring. È interessante notare che Git non ha notato che ho rinominato il file Form1.cs in Form1a.cs e creato un Form1.cs completamente nuovo, completamente diverso, ma invece ha notato un nuovo file Form1a.cs e ha trovato un sacco di differenze tra file Form1.cs precedenti e nuovi. Questo naturalmente porterà a diffs totalmente garbaged, ma non mi interessa in questo caso fintanto che tutti i file sono gestiti correttamente alla fine.

Quindi sono tornato al master per eseguire altre piccole modifiche. Niente di conflittuale. Fino ad ora, tutto ha funzionato bene.

Oggi, volevo tornare al mio refactoring della filiale per continuare quel lavoro. Ma tutto quello che ottengo è il seguente messaggio:

git.exe checkout form-refactoring 

Aborting 
error: The following untracked working tree files would be overwritten by checkout: 
Form1.Designer.cs 
Please move or remove them before you can switch branches. 

Che cosa dovrebbe essere? Il file menzionato non è untracked. Né nel ramo principale, né nel ramo di refactoring del modulo. Fa parte di entrambi i rami, ma uno non è un discendente dell'altro. Cosa succederebbe se lo cancellassi, è andato per sempre? Non mi fido di Git per riportare il file corretto se elimino qualcosa ora. Non ho giocato con nessun file al di fuori delle mie operazioni Git menzionate, quindi perché dovrei giocare con qualsiasi file per continuare a utilizzare le operazioni Git adesso? Git ha rotto, Git dovrebbe gestirlo ora!

In questo momento, non posso continuare con il mio lavoro perché non posso cambiare ramo. C'è una soluzione facile a questo?

La versione di Git è 1.7.6, TortoiseGit è 1.7.3.

+0

Ti capita di avere un modello che corrisponde Form1.Designer.cs nel vostro .gitignore o qualsiasi altro ignorare configurazioni? – James

+0

Quel file ha un segno di spunta verde in Explorer e ha anche una cronologia. Quindi presumo che non sia ignorato. Inoltre, ci sono altri file Form.Designer.cs nel mio progetto che non causano alcun problema. E questo non è il primo repository Git che ho creato con VS2010, fino ad oggi anche pochi sforzi nella ramificazione hanno funzionato bene. – ygoe

+0

Si prega di ricontrollare i filtri ignorare per vedere se sono cambiati per quel repository o ramo. Puoi ancora vedere lo stato e la cronologia su un file se è stato aggiunto prima del filtro ignora.Tutto ciò che usa lo stato git lo segnalerà comunque (come i segni di spunta di Explorer) Ciò può causare l'errore che stai indicando se ci sono davvero modifiche al file perché Git ora lo ignorerà quando eseguirà lo stato Git. Tuttavia Git continuerà a sapere che è cambiato quando prova a fare un checkout e ti dà questo errore. – James

risposta

17

L'opzione di configurazione core.ignorecase non è stata impostata e Visual Studio ha rinominato il file .Designer.cs nel caso, passando da una lettera maiuscola a una "D" inferiore (o viceversa). Questo era il problema alla fine. Mi è costato un po 'di cronologia dei file (eliminazione e riaggiunta dei file) per risolvere questo errore dopo aver impostato l'opzione su true. In realtà l'opzione era impostata su un computer, ma quando clonando il repository, l'impostazione si è persa in qualche modo. E poi il destino stava solo aspettando VS per rinominare quel file per catturarmi.

Così su Windows, è sempre necessario assicurarsi che queste due impostazioni siano corrette dopo un intervento di init/clone: ​​

git config core.ignorecase true 
git config core.autocrlf false 

Alcuni strumenti (TGIT, gitscc ecc) non sembrano per farlo destra. È assolutamente necessario per il normale funzionamento su Windows, ma a Git non interessa se non sono impostati correttamente e ti lascia solo inciampare su di loro senza dirti perché. È tanto mentire quanto utile in questa faccenda.

0

Git non consente di cambiare ramo in caso di perdita di dati.

Generalmente è una buona idea eseguire tutte le modifiche prima di passare a un altro ramo. Se siete assolutamente sicuri che non hai fatto questo cambiamento di quanto si possa ripristinare il vostro albero di lavoro utilizzando

git reset --hard HEAD 

comando. Ma non consiglio vivamente di farlo. Utilizzare

git stash 

per memorizzare le modifiche nella memoria interna. In questo caso puoi sempre recuperare i tuoi dati.

+0

Al momento non ho modifiche non modificate. Ho commesso tutto prima di passare alla sezione master e ho anche impegnato tutto in questo momento, ma non posso passare da nessuna parte. L'azione di commit dice che non ho modifiche senza commit. La tua risposta è ancora valida? – ygoe

+0

@LonelyPixel il tuo commento è confuso. git dice che ci sono dei cambiamenti. In ogni caso git stash non fa nulla su una directory di lavoro pulita. Quindi è sicuro sperimentare. –

+0

Com'è confuso? Stash dice: Stash success - Nessuna modifica locale da salvare. – ygoe

0

Sembra che il ramo XXX (refactoring del modulo) contenga questo file ma YYY no. E ora stai provando a passare dal ramo YYY a XXX. Git ha paura di dimenticarti di aggiungere un file in modo che non permetta di spostarsi su un altro ramo.

Usa

git status 

per determinare se questo file (Form1.Designer.cs) è non tracciata.In questo caso, è sufficiente eseguirlo e quindi spostarsi in un altro ramo in modo sicuro

+0

Come ho commentato l'altra risposta, non ci sono modifiche non salvate e quel file non è realmente non tracciato. Non posso più fare nulla per ripulire la mia directory di lavoro. – ygoe

+0

git clean -f -d pulisce il tuo albero di lavoro. –

+0

Questo non aiuta. – ygoe

0

Prima di tutto, Git non ti sta mentendo. Il file è davvero tracciato nel ramo, e in realtà esiste nell'albero di lavoro, ed è davvero non tracciato.

Dato che nei commenti si suggerisce altrove che il file non viene visualizzato in diff o anche in git status, sembra che l'abbia aggiunto al proprio gitignore (forse involontariamente tramite un motivo jolly). So che hai detto di no, ma se non viene visualizzato nell'output di git status come file non tracciato, non viene tracciato e ignorato. Per verificare ciò, è possibile elencare tutti i file ignorati da .gitignore:

git ls-files -i --exclude-from=.gitignore 

È possibile anche elencare tutti i file non monitorate, ignorato o meno:

git clean -xdn 

(Lei sembra dire che sei molto sicuro che il file sia tracciato - se lo fosse davvero, git show HEAD:path/to/file mostrerebbe il contenuto impegnato del file. Sospetto, tuttavia, che ciò dirà invece "fatale: percorso percorso/al/file" non esiste in "HEAD" " .)

Un altro modo per verificare che il file sia non tracciato e ignorato è semplicemente per r ename it, quindi vedi se git status lo segnala come cancellato; se non lo fa, non è stato rintracciato.

Supponendo che questo elenchi il file in questione, è necessario esaminare il file nell'albero di lavoro. Puoi vedere quale versione del file utilizza l'altro ramo usando git show other-branch:path/to/file, per confrontare. Se sei soddisfatto di non aver bisogno della versione nell'albero di lavoro, rimuovilo semplicemente. Se sei preoccupato potresti averne bisogno, rinominalo o spostalo fuori dalla directory. Se ti rendi conto che ne hai bisogno, dovresti capire che cosa ignora il pattern è ignorarlo, rimuoverlo, aggiungerlo e commetterlo. In ogni caso, una volta gestito il file, sarai in grado di cambiare ramo.

+0

'git ls-files -i --exclude-from = .gitignore' non mostra nulla. Usando il percorso relativo reale a .gitignore mostra "fatale: non può usare .. \. Gitignore come un file di esclusione". 'git show HEAD: path/to/file' mi mostra il contenuto previsto di quel file. Quindi è veramente archiviato. Rinominando il file, 'git status' riporta l'eliminato e un nuovo file non tracciato. Git mi mostrerà anche lo stesso file dall'altro ramo, ma dal momento che quei file sono generati dal progettista VS, non posso confrontarli con il mio occhio. - Quindi posso affermare tranquillamente che Git mi sta mentendo? – ygoe

+0

Bene, allora sembra che qualcosa sia riuscito a uscire dalla sincronizzazione o corrotto in qualche modo, se un clone del repository, con l'albero di lavoro identico a quello originale, funziona normalmente. È un po 'difficile da credere, dal momento che questa è una parte fondamentale di Git abbastanza ben testata, ma se sei sicuro che sia un errore spuria, potresti segnalarlo alla mailing list di Git. – Cascabel

+0

È ancora un po 'rotto. :(Potrei impegnarmi con il mio nuovo repository e tornare al master, ma l'unione fallisce per lo stesso motivo: Git ritiene che uno dei file che gestisce non sia tracciato e venga sovrascritto. alla mailing list, ma non c'è ancora risposta. Arrestare un repository non sembra essere troppo interessante – ygoe

0

Questo risolto il problema per me rm .git/fs_cache

Problemi correlati