2011-12-16 22 views
6

Ho avuto un problema con git. Ho un repository di un progetto che sta invecchiando e voglio iniziare una nuova versione. Ho creato una nuova filiale (3.0-wip) e ho eliminato i file e le cartelle per ricominciare. Tuttavia, se eseguo il checkout del mio ramo principale, anche i file e le cartelle sono scomparsi.Mantenere una struttura di directory diversa in diversi rami git

Come posso avere il mio repository in modo che il mio ramo master abbia tutto il repository remoto, ma una directory di lavoro completamente diversa nel mio 3.0-wip che posso modificare a mio piacimento senza distruggere file e cartelle in nessun altro ramo?

+0

Forse si impegnano al vostro ramo 3.0-wip prima della verificazione al ramo master? In caso contrario, probabilmente è questo il problema. –

+0

Ho clonato il repository esterno. Creato e verificato il nuovo ramo '3.0-wip'. File/cartelle cancellati tramite Finder. Creato il nuovo file 'index.php' e lo ha impegnato. Se eseguo il checkout del mio ramo 'master', i file sono ancora andati, e' git status' mostra tutti i file/cartelle come 'cancellati:'. –

+1

Hai aggiunto git. | git aggiungi -u prima del tuo commit? Come hai commesso quei cambiamenti nel tuo ramo 3.0-wip? –

risposta

6

Le modifiche apportate a un ramo non influiscono su un altro ramo. Devi anche impegnare tutte le eliminazioni, questo è ciò che Dominic ha cercato di spiegare. Basta fare:

$ git co $NEWBRANCH 
$ git status 

E vedrete milioni di cancellazioni non memorizzate. Devi usare git rm per rimuovere i file.
Non sono sicuro git add --all gestirà cancella pure. In ogni caso, questo è IMO non il modo migliore per ricominciare daccapo perché il nuovo ramo avrà ancora la vecchia storia.

penso che sia meglio creare un nuovo "disconected" commit:

  1. Creare un nuovo repo: mkdir $DIR; cd $DIR; git init
  2. Creare il primo commit. touch README; git add --all; git commit -m "Init"

Passare al di pronti contro termine originale e:

  1. aggiungerlo come un telecomando: git remote add start-anew $DIR/.git
  2. prenderlo: git fetch start-anew
  3. tirare in: git co -b start-anew start-anew/master

E voilà un ramo con una storia fresca e vuota.

Potrebbe essere necessario eliminare il telecomando e modificare anche il telecomando per il ramo. Di solito sto modificando manualmente .git/config, finora senza un incidente.

+0

Ho provato a seguirlo, ma quando ho provato a recuperare il repository 'start-anew', ottengo un errore 'fatale: The remote end hang in'. –

+0

Funziona per me con 'git versione 1.7.6.4'? – Martian

+0

Ha funzionato per me spingendo il repository 'start-anew' su Github e poi recuperando da lì. Deve essere qualcosa a che fare con il tentativo di recuperare dalla mia macchina locale. –

8

Quello che sta succedendo è che non stai usando git correttamente. Non c'è assolutamente alcun problema con la creazione di un ramo e l'eliminazione di file e cartelle. Quando si ritorna al ramo principale, i file e le cartelle cancellati verranno ripristinati, poiché non sono stati eliminati da quel ramo.

Quello che sta accadendo nel tuo caso è che hai rimosso il file/le cartelle da sotto git, usando l'eliminazione del sistema operativo, piuttosto che il comando "git rm". Ecco perché lo stato di git li segnala come "cancellati". È anche il motivo per cui i file rimangono cancellati quando si cambia succursale. git si aspetta che i file siano lì e loro no.

stato Git dice di eseguire "git add", ma che non funziona. Poiché il file non è più lì, l'esecuzione di git add fallirà in modo silenzioso. Si potrebbe non notare, ma il messaggio dice anche di eseguire "git rm". Potresti pensare di non poterlo fare da quando il file è finito, ma non è vero. Il comando rm sarà ancora riuscirà a rimuovere il file dal repo, anche se hai già stato rimosso dal file system.

L'altra e più semplice cosa che puoi fare è eseguire git add -A. L'indicatore -A indicherà aggiungere per notare eventuali file cancellati o aggiunti.

Prova questo per un test:

git init test-delete 
cd test-delete 
touch filea 
mkdir dir_b 
touch dir_b/fileb 
git add . 
git commit -m "Initial commit" 
git checkout -b new_branch 
rm -rf dir_b 
git add -A 
git commit -m "deleted files from branch" 
(ls to prove files arent' there) 
git checkout master 
(ls to show files have been restored) 
git checkout new_branch 
(ls to show files are gone again)