.gitignore e "I seguenti file dell'albero di lavoro non tracciati verrebbero sovrascritti dal checkout"


828

Quindi ho aggiunto una cartella al mio file .gitignore.

Una volta che faccio un git statusmi dice

# On branch latest
nothing to commit (working directory clean)

Tuttavia, quando provo a cambiare i rami ottengo quanto segue:

My-MacBook-Pro:webapp marcamillion$ git checkout develop
error: The following untracked working tree files would be overwritten by checkout:
    public/system/images/9/thumb/red-stripe.jpg
    public/system/images/9/original/red-stripe.jpg
    public/system/images/8/thumb/red-stripe-red.jpg
    public/system/images/8/original/red-stripe-red.jpg
    public/system/images/8/original/00-louis_c.k.-chewed_up-cover-2008.jpg
    public/system/images/7/thumb/red-stripe-dark.jpg
    public/system/images/7/original/red-stripe-dark.jpg
    public/system/images/7/original/DSC07833.JPG
    public/system/images/6/thumb/red-stripe-bw.jpg
    public/system/images/6/original/website-logo.png
    public/system/images/6/original/red-stripe-bw.jpg
    public/system/images/5/thumb/Guy_Waving_Jamaican_Flag.jpg
    public/system/images/5/original/logocompv-colored-squares-100px.png
    public/system/images/5/original/Guy_Waving_Jamaican_Flag.jpg
    public/system/images/4/thumb/DSC_0001.JPG
    public/system/images/4/original/logo.png
    public/system/images/4/original/DSC_0001.JPG
    public/system/images/4/original/2-up.jpg
    public/system/images/3/thumb/logo2.gif
    public/system/images/3/original/logo2.gif
    public/system/images/3/original/Guy_Waving_Jamaican_Flag.jpg
    public/system/images/3/original/11002000962.jpg
    public/system/images/2/thumb/Profile Pic.jpg
    public/system/images/2/original/Profile Pic.jpg
    public/system/images/2/original/02 Login Screen.jpg
    public/system/images/1/original/Argentina-2010-World-Cup.jpg
Please move or remove them before you can switch branches.
Aborting

Ecco come appare il mio file .gitignore:

.bundle
.DS_Store
db/*.sqlite3
log/*.log
tmp/**/*
public/system/images/*
public/system/avatars/*

Come faccio a farlo funzionare in modo da poter cambiare ramo senza eliminare quei file?

Se apporto una modifica, interesserà quei file? In altre parole, se in seguito tornassi a questo ramo sarebbe tutto perfetto fino al mio ultimo impegno?

Non voglio perdere quei file, non li voglio solo rintracciati.


10
se davvero non ti interessano questi file: git checkout -f <branch> nel mio caso i file vengono generati nel processo di compilazione, quindi non mi interessa di meno
Hobbamok,

A volte succede se fai 'git checkout' (senza un nome di filiale). Per risolvere, fai 'git checkout branchname'
crafter

Domanda separata, ma criticamente correlata: perché si verifica questo errore? perché git non può semplicemente passare tra i rami?
ahnbizcad,

@ahnbizcad Perché se stavi lavorando su un nuovo file e qualcuno su un altro ramo si fosse imbattuto in un file con lo stesso nome, ti incazzeresti se Git rovinasse la tua versione quando hai cambiato ramo. Ecco perché la bandiera -f è lì.
Matthew Sharp,

Risposte:


264

Sembra che tu voglia ignorare i file ma sono già stati sottoposti a commit. .gitignore non ha alcun effetto sui file che sono già nel repository, quindi devono essere rimossi con git rm --cached. Gli --cachedimpedirà di avere alcun effetto sulla tua copia di lavoro e verrà contrassegnato come rimosso la prossima volta che esegui il commit. Dopo che i file sono stati rimossi dal repository, il .gitignore impedirà che vengano nuovamente aggiunti.

Ma hai un altro problema con il tuo .gitignore, stai usando eccessivamente i caratteri jolly e ne sta causando una corrispondenza minore di quanto ti aspetti. Invece consente di modificare .gitignore e provare questo.

.bundle
.DS_Store
db/*.sqlite3
log/*.log
tmp/
public/system/images/
public/system/avatars/

2
Grazie .... Ho rimosso tutti i file dal ramo corrente e ho eseguito il backup. Quindi cambi i rami e rimettili. Ha funzionato Inoltre, grazie per il suggerimento su
.gitignore

@marcamillion: cosa intendi con "che ha funzionato"? Se i file sono stati tracciati sul ramo in cui sei passato, li hai sovrascritti con le tue versioni, che potrebbero essere diverse ...
Cascabel,

1
Ho riscontrato un problema con una cartella / build che non ha bisogno di essere rintracciato. Così ho cancellato la cartella locale, ho eseguito il commit del mio file .gitignore, quindi ho verificato l'altro ramo. Alla fine ha funzionato per me.
Mike S.,

16
Penso che la prima parte sia per il contrario di questo particolare messaggio di errore. Questo errore indica che l'utente si trova attualmente in un ramo in cui non sono tracciati quei file JPG e l'utente sta tentando di passare a uno che lo fa. Quindi fare git rm --cachednon farà la differenza, quei file non esistono nel ramo corrente. Per questo errore, penso che l'utente debba invece seguire la risposta di @Greg Hewgill: "spostarli dalla copia di lavoro, cambiare ramo e spostarli indietro".
Studgeek

5
Come si potrebbe risolvere il problema your files would be overwrittencon fatal: pathspec 'test/node_modules' did not match any filesquando lo faccio git rm -r --cache test/node_modules? Non riesco a estrarre a causa del messaggio sovrascritto e non riesco a rimuoverlo perché git non riesce a trovarli (sono lì)
HMR

1047

ATTENZIONE: eliminerà i file non tracciati, quindi non è un'ottima risposta alla domanda posta.

Ho colpito anche questo messaggio. Nel mio caso, non volevo conservare i file, quindi questo ha funzionato per me:

git 2.11 e successivi

git clean  -d  -f .

vecchio git

git clean  -d  -f ""

Se si desidera rimuovere anche i file ignorati da git, eseguire il comando seguente.

ATTENZIONE !!! QUESTO PIÙ PROBABILE DISTRUGGE IL TUO PROGETTO, UTILIZZARLO SOLO SE CONOSCI IL 100% COSA STAI FACENDO

git 2.11 e successivi

git clean  -d  -fx .

vecchio git

git clean  -d  -fx ""

http://www.kernel.org/pub/software/scm/git/docs/git-clean.html

  • -x significa che vengono rimossi anche i file ignorati e i file sconosciuti a Git.

  • -d significa rimuovere le directory non tracciate oltre ai file non tracciati.

  • -f è necessario per forzare l'esecuzione.


7
Grazie, dopo quello pulito sono stato in grado di riformulare;
Alexander Beletsky,

139
ATTENZIONE ALLA CORRENTE git clean!
Noel,

249
Per evitare un facepalm, eseguilo prima con l'opzione dry-run per vedere cosa farebbe: git clean -dfxnoppuregit clean -dfx --dry-run
Dennis,

74
Merda santa. Questo elimina tutti i file di configurazione sul mio xcode e ora il progetto si sta trasformando in progetto mac. ATTENZIONE AL MASSIMO DI QUESTO COMANDO. Ho pensato che l'avrebbe rimosso solo da Git.
tyegah123,

25
L' -xopzione mi fa male
stato il

589

Avviso: questo eliminerà i file locali che non sono indicizzati

Basta forzarlo: git checkout -f another-branch


78
Avviso: questo eliminerà i file locali che non sono indicizzati.
givanse

git clean non ha funzionato per me, ma la forza era esattamente ciò di cui avevo bisogno. Era bloccato su quel ramo e ne avevo solo bisogno per cambiare ramo.
Simon The Cat,

7
Non volevo il file che non era indicizzato! +1 per te
ryansstack

ho ricevuto questo errore ,,, :(error: pathspec 'mybranch' did not match any file(s) known to git.
Budi Mulyo

2
Questa è la vera risposta
metamonkey,

147

Se sei su OS X, potrebbe essere perché il nome di un file ha avuto caratteri maiuscoli e minuscoli. Prova a impostare la seguente opzione di configurazione:

git config core.ignorecase true

13
Funzionava anche su Windows, sembra che questa situazione si sia verificata in primo luogo a causa di cambiamenti del caso che GIT non è stato in grado di determinare
SagiLow

4
Questo è esattamente il problema che ho avuto, un percorso di file era diverso da una lettera maiuscola - Windows lo considera uguale ma GIT non è questo il problema.
Daniel Sokolowski il

1
Il mio problema si è verificato nel checkout in un'altra filiale in Windows 10, e solo questo lavoro per me, grazie
Weijie dom

eccezionale! questo risolveva il mio problema quando mi
spostavo

1
Funziona anche se ci provi git rebasepure. Grazie.
user3890355

42

Git ti sta dicendo che vuole creare file (chiamati public/system/images/9/...ecc.), Ma hai già dei file esistenti in quella directory che non sono tracciati da Git. Forse qualcun altro ha aggiunto quei file al repository Git, e questa è la prima volta che passi a quel ramo?

C'è probabilmente un motivo per cui quei file nel tuo developramo ma non nel tuo ramo attuale. Potrebbe essere necessario chiedere ai tuoi collaboratori perché.

come faccio a farlo funzionare in modo da poter cambiare i rami senza eliminare quei file?

Non puoi farlo senza far sparire i file in qualche modo. Si potrebbe cambiare titolo publical my_publico qualcosa, per ora.

se in seguito tornassi in questo ramo sarebbe tutto perfetto fino al mio ultimo impegno?

Se si impegnano le modifiche, Git non le perderà. Se non esegui il commit delle modifiche, Git si impegnerà a fondo per non sovrascrivere il lavoro svolto. Questo è ciò di cui Git ti sta avvisando in prima istanza qui (quando hai provato a cambiare ramo).


Grazie per la spiegazione. Ho eseguito il backup dei file, ho cambiato i rami e li ho uniti, quindi ho sostituito i file nella cartella pubblica. Ha funzionato
marcamillion,

1
Come ho commentato la risposta di @ Arrowmaster. Questa è la risposta giusta per il messaggio di errore. Potrebbe non essere la risposta giusta per questo particolarmente interrogatore poiché i suoi problemi reali sembrano essere il suo gitignore.
Studgeek

38

Questo ha funzionato per me.

 1. git fetch --all
 2. git reset --hard origin/{branch_name}

5
Aggiungi una spiegazione alla tua soluzione. vedi stackoverflow.com/help/how-to-answer
user7294900

Ecco la mia opinione. La tua copia locale del ramo remoto in realtà ha tutti i file non tracciati, in qualche modo. Lo stai verificando per ripristinare i file non tracciati di cui inizialmente si è lamentato. Ora puoi passare ad altri rami
ahnbizcad l'

2
Per qualche ragione, questa è l'unica soluzione funzionante per me. Grazie compagno.
Kiwad,

Risolto il mio problema Grazie
Devashis Kant,

Mille grazie, così semplice! git reset - origine / sviluppo soft. Come odio questi conflitti di unione modifica. Questo comando è così carino e semplice.
nine9five

22

Esiste un comando per questo compito delicato (eliminazione permanente dei file non tracciati)

git clean -i

Quindi git pulllo farà.


13

Per coloro che hanno bisogno di qualcosa di meno vasto della risposta di Scott Schafer ,

git clean -f

probabilmente funzionerà. Consiglio vivamente di correre

git clean --dry-run

primo. Quel comando produrrà un elenco di file che Git rimuoverà se esegui git clean -fe potrebbe salvarti il ​​dolore di rimuovere inavvertitamente qualcosa che non volevi.

Vedi questa risposta Stack Oveflow o i documenti per ulteriori informazioni su git clean.


12

Sfortunatamente nessuno dei due git rm --cachedo git clean -d -fx ""lo ha fatto per me.

La mia soluzione è stata quella di spingere il mio ramo in remoto, clonare un nuovo repository, quindi fare la mia unione nel nuovo repository. Altre persone che accedono al pronti contro termine hanno dovuto fare lo stesso.

Morale della storia: usa un .gitignorefile dall'inizio.


10

Se vuoi risolvere rapidamente questa domanda, puoi usare questo comando:

git checkout -f dev

Questo mi ha aiutato, quando il mio problema non era correlato ad .gitignoreAfaik.
Nakilon,

errore: pathspec 'dev' non corrisponde ad alcun file noto a git.
Nero

@Black 'dev' è il nome del ramo, metti invece il tuo ramo
Vinit Solanki,

8

Ho avuto lo stesso problema durante il checkout in una filiale in base a un commit precedente. Git ha rifiutato di effettuare il checkout a causa di file non tracciati.

Ho trovato una soluzione e spero che possa aiutarti anche tu.

L'aggiunta delle directory interessate .gitignoree l'emissione $ git rm -r --cachedsu di esse apparentemente non sono sufficienti.

Supponiamo che tu voglia fare un branch basato su un commit precedente per testare alcune cose e tornare alla versione corrente. Lo farei nei seguenti passaggi:

  1. Imposta i file non tracciati: modifica .gitignoree applica $ git rm -r --cachedai file e alle directory che git deve ignorare. Aggiungi anche il file .gitignorestesso a .gitignoree non dimenticare di emettere $ git rm -r --cached .gitignore. Questo assicurerà che il comportamento ignore di git lasci lo stesso nei commit precedenti.

  2. Conferma le modifiche che hai appena apportato:

    $ git add -A
    $ git commit

  3. Salvare il registro corrente, altrimenti potrebbero verificarsi problemi con il ritorno alla versione corrente

    $ git log > ../git.log

  4. Hard reset del commit K

    $ git reset --hard version_k

  5. Crea un ramo basato sul commit K

    $ git branch commit_k_branch

  6. Acquista in quel ramo

    $ git checkout commit_k_branch

  7. Fai le tue cose e impegnale

  8. Torna al master nuovamente

    $ git checkout master

  9. Ripristina nuovamente la versione corrente

    $ git reset current_version o $ git reset ORIG_HEAD

  10. Ora puoi resettare duramente HEAD

    git reset --hard HEAD

NOTA! Non saltare l'ultimo passo (come ad esempio $ git reset --hard ORIG_HEAD ), altrimenti i file non tracciati git lamentati sopra andranno persi.

Mi sono anche assicurato che i file di cui ci si lamentava non fossero cancellati. Li ho copiati in un file di testo e ho inviato il comando$ for i in $(cat ../test.txt); do ls -ahl $i; done

Se esegui nuovamente il checkout nella succursale sopra menzionata, non dimenticare di emettere $ git statusper assicurarti che non vengano visualizzate modifiche indesiderate.


8

Questo è successo a me su un sistema Windows 8 , usando Git dal prompt dei comandi. Il resto del mio team usa TFS e io uso git-tf di Microsoft per fare push / pull tra TFS e il mio repository Git locale.

Il problema è sorto a causa di alcuni file che erano stati rinominati solo per cambiare il loro caso . Ciò che sembra essere successo è stato questo:

  • I file sono stati registrati con un involucro misto nei loro nomi.
  • In un commit successivo, i nomi dei file sono stati cambiati in minuscolo.
  • git-tf inizialmente ha ottenuto i file in maiuscole e minuscole.
  • Quando i file sono stati rinominati in minuscolo, git-tf non ha ottenuto i file perché in Windows 8 quei nomi di file sono equivalenti.
  • Dato che Git fa distinzione tra maiuscole e minuscole, si è lamentato del fatto che avevo i file con case misti che non erano nel controllo del codice sorgente. Ma usando git status, non ho potuto vedere alcuna modifica, poiché nel prompt dei comandi di Windows quei nomi di file sono equivalenti.

La soluzione più semplice per me era:

  • git checkoutuna versione precedente del progetto, ben prima che quei file fossero mai stati aggiunti .
  • Quindi git checkoutl'ultima versione del progetto, con il case corretto.

+1 Sono stato in grado di utilizzare git log sul ramo e sul ramo correnti per rifare le modifiche per vedere quando si è verificato il commit che ha cambiato il caso; poi l'ho hackerato ...
saggio il

4

Queste due funzioni (git rm --cached, git checkout -f another-branch) NON hanno funzionato per me.

Invece, ho rimosso fisicamente il file (in eclipse) come quello che Git ti dice di fare; Sposta o rimuovili prima di poter cambiare ramo.

e poi l'ho aggiunto / impegnato.

e poi ho tirato e ha funzionato!


4

Nel mio caso, il problema era con i sottomoduli. masterè stato unito a un altro ramo che ha aggiunto un nuovo sottomodulo al progetto. Il ramo che stavo provando a fare il checkout non ce l'aveva, ecco perché git si lamentava di file non tracciati e nessuna delle altre soluzioni suggerite ha funzionato per me. Ho costretto il checkout alla mia nuova filiale e ho tirato il maestro.

  • git checkout -f my_branch
  • git pull origin master
  • git submodule update --init

3

Nel mio caso git rm --cachednon ha funzionato. Ma l'ho preso con ungit rebase


3

Stavo anche affrontando un problema simile e ho provato tutte le soluzioni sopra pubblicate ma non ha funzionato

Il problema è stato causato quando ho rinominato la mia onMusicUpdateListener.javaa OnMusicUpdateListener.javain developramo.

Ora masteraveva onMusicUpdateListener.java e developaveva lo stesso file diOnMusicUpdateListener.java

Ora ogni volta che sono passato al master mi ha dato un errore

The following untracked working tree files would be overwritten by checkout

e poi aborted.

Per risolvere questo problema, ho forza checked out masterramo e poi rinominato la mia onMusicUpdateListener.javaa OnMusicUpdateListener.java, committede poi mergedcon il developramo.

Quindi ho aggiornato il mio developramo in mergingesso mastere ora tutto è tornato alla normalità e il problema è stato risolto.


Ho incontrato problemi simili prima. A mio avviso, il problema della sensibilità del case sembra essere un problema solo su Windows. Immagino che stai sviluppando su Windows?
Ji_in_coding il

2

Questo potrebbe essere un problema di autorizzazione,

cambiare la proprietà,

sudo chown -v -R usr-name:group-name folder-name

Ho anche avuto lo stesso problema di Won. Ho aggiunto un .gitignore a una cartella che era già stata tracciata. Ho eliminato il file e poi sono stato in grado di fare un checkout git.
cbloss793,

2

2 file con lo stesso nome ma caso diverso potrebbero essere il problema.

Puoi eliminarne uno su questi file o rinominarlo. Ex:

Pdf.html.twig (The GOOD one)

pdf.html.twig (The one I deleted)

2

Sposta i file invece di eliminarli

Un modo per evitare di eliminare i file è invece spostarli. Per esempio:

cd "`git rev-parse --show-toplevel`"
git checkout 2>&1 | while read f; do [ ! -e "$f" ] || mv "$f" "$f".bak; done

1

Se hai rinominato un file localmente e quindi fai un pull, verrà visualizzato quel messaggio di errore.


Come superare questo errore in quel caso? Questo messaggio appare anche quando si cambiano i rami dopo aver cambiato il caso in un nome file (MyFile => myfile).
Bernhard Döbler il

1

è facile da risolvere, git sta dicendo che hai gli stessi file in entrambi i rami, quindi devi eliminare i file specifici dal ramo principale e quindi sarai in grado di unire:

git unisci "il tuo ramo"

Spero che funzioni per te, ho appena risolto il mio errore. il mio errore era:

errore: I seguenti file dell'albero di lavoro non tracciati verrebbero sovrascritti dall'unione: .vs / slnx.sqlite Spostarli o rimuoverli prima di unirli. Interruzione

Ora funziona! Nel mio caso .vs / slnx.sqlite è stato generato da Visual Studio, dovevo chiuderlo prima di eliminarlo.


0

Nel mio caso, stavo vedendo questo errore perché sto usando un popolare CMS open source e la directory che causava problemi era la directory di upload in cui scrive il CMS.

Quindi quello che stava dicendo è che ci sono file che non hai, ma che non puoi ottenere dal controllo delle versioni.

Sto acquisendo tutti i file dal sito live al mio locale, quindi controllerò questo nel repository nella speranza che questo risolva il problema.


0

Elimina il file .gitignore da appname / gen / per risolvere questo problema.


0

Sono appena andato al file system e ho eliminato il file direttamente, quindi ho continuato con il checkout git e ha funzionato.

Ho riscontrato che il problema si è verificato più volte e potrebbe essere correlato agli sviluppatori che eseguono eliminazione, push, riaggiunta, push o cose del genere.


0

La maggior parte delle risposte considera la cancellazione o la rimozione dei file, che è il modo più semplice. Ma a volte non vuoi sbarazzarti dei file locali. Unisciti a una strategia, quindi git ha una soluzione anche per questo;

git merge --strategy=ours master 

0

Basta eliminare i file o rinominarli.

per esempio

$ git pull
Enter passphrase for key '/c/Users/PC983/.ssh/id_rsa':
error: Your local changes to the following files would be overwritten by merge:
        ajax/productPrice.php
Please commit your changes or stash them before you merge.
error: The following untracked working tree files would be overwritten by merge:
        ajax/product.php
Please move or remove them before you merge.
Aborting
Updating a04cbe7a..6aa8ead5

Ho dovuto rinominare / eliminare ajax / product.php e ajax / produtPrice.php .

Non preoccuparti, git pull li riporterà indietro. Ti suggerisco di rinominarli invece di eliminarli, perché potresti perdere alcune modifiche.

Se questo non aiuta, devi eliminare l'intero Branch, crearlo di nuovo e quindi farlo git pull origin remotebranch


0

Per salvare i file modificati e utilizzare il contenuto modificato in un secondo momento. Ho trovato questo errore mentre provo a controllare un ramo e quando provo a rebase. Prova Git Stash

git stash


0

Controlla se il nome di una cartella ha '/' o un simbolo speciale, quindi rinomina quelle cartelle. Quindi basta clonare il repository in un'altra posizione.


0

Una soluzione semplice potrebbe essere: assicurati di essere nella directory di lavoro corretta in GitBash. Quel messaggio si verifica quasi ogni volta se un utente tenta di unire una directory troppo alta nella sua gerarchia di cartelle.

Esempio:

/workspace/git/myBashSourceFolder/myProjectSourcefolder

Scenario: l'utente ha clonato il repository in git-folderha creato un nuovo progetto Java in Eclipse, importato il repository clonato. Eclipse ha impostato myProjectSourceFolder come cartella di origine nel suo progetto locale. pertanto l'Utente è entrato in git bash e ha spinto, tirato e commesso il suo progetto da lì. git si sincronizza quindi myProjectSourceFolder- ma non ha record nella sua cronologia per myBashSourceFolder. Pertanto un push / pull / merge da myBashSourceFolder produrrà l'output dato, se l'utente tenta di sincronizzare da lì la prossima volta, invece della cartella in cui ha lavorato in precedenza.

Soluzione: immettere la cartella corretta e riprovare. In quasi ogni volta che ho incontrato, questa soluzione ha funzionato bene :)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.