2015-11-18 2 views
5

Sto cercando di ripulire il mio repository git eGit: local-tracking, aggiungi un nuovo ramo?

  1. Creare un nuovo ramo che rispecchia la mia produzione (master) ramo.
  2. Rimuovere eventuali rami non necessari, remoti o locali.
  3. Fai miei rami locali filiali locali-tracking (IDK se ho bisogno di fare questo, i benefici?)
  4. Avere un ramo per ogni fase del mio flusso di lavoro cioè un ramo per locali & dev (dev), 1 ramo per la gestione temporanea (allestimento) e 1 ramo per la produzione (produzione). Local e dev possono condividere lo stesso ramo di lavoro, ma separare i rami per la gestione e la produzione.

Dalla riga di comando è possibile vedere il mio ambiente.

$ git remote 
dev 
origin 
production 
staging 

$ git branch -r 
dev/dev 
origin/HEAD -> origin/master 
origin/dev 
origin/master 
production/master 
wpengine-findcra/master 

$ git branch -vv 
dev     xxxxxxx <comment> 
*master    xxxxxxx [origin/master] <comment> 
production/staging xxxxxxx [remotes/production/master] <comment> 
staging/master  xxxxxxx <comment> 

Ho 4 sedi in cui lavoro. Codice fluisce da 1 a 4.

  1. mia macchina locale
  2. server di sviluppo
  3. server di gestione temporanea
  4. server di produzione

voglio aggiungere una nuova filiale appositamente per la messa in scena server, e in questo momento voglio che rispecchi il ramo di produzione (master). Ma mi imbatto in questo errore e non so cosa fare.

$ git checkout master 
$ git branch staging 
error: there are still refs under 'refs/heads/staging' 
fatal: Failed to lock ref for update: Is a directory 

Il mio codice è aggiornato in origine/master e dev/dev.

+0

Questa risposta fa un po 'senso, ma la domanda iniziale che fare con "spingere" e non riesco a vedere come applicarla alla mia situazione http://stackoverflow.com/questions/11245897/push-to-remote-repo-gives-the-error-there-are-still-refs-under?answertab=active#tab-top – italiansoda

risposta

7

Se si dispone di un ramo con un nome che contiene una barra, git creerà (in .git/refs/heads) una directory denominata come il nome del proprio ramo fino alla barra. In quella directory posizionerà i riferimenti per il ramo stesso. Quindi la directory .git/refs/heads/staging/ esiste e contiene un file "master" a causa del ramo staging/master.

Quando si tenta di creare il ramo "staging", git tenterà di creare il file .git/refs/heads/staging. Dato che questo esiste già ma è una directory, questo fallirà. Quindi non puoi avere due rami con questi nomi nel tuo repository.

Nelle versioni più recenti di git il messaggio di errore sarà simile a questa:

fatal: cannot lock ref 'refs/heads/staging': 'refs/heads/staging/master' exists; cannot create 'refs/heads/staging' 
+0

Grazie, questo mi ha indicato la giusta direzione! Ho finito con l'eliminazione di uno staging/master di una diramazione locale e la creazione di una nuova staging/staging della filiale collegata in remoto al mio server di staging. Ho anche spinto questo al mio server di origine all'origine/staging aka github. Ho cancellato lo staging/master, ma sono stato in grado di eseguire il checkout di origine/master e diramarlo nella nuova staging/staging dato che ero allo stesso codice base. – italiansoda