2009-09-21 12 views
41

Appena installato git su Windows. Ho impostato la variabile GIT_DIR per essere c: \ git \ e ho verificato che questa variabile d'ambiente sia mantenuta da cygwin (ad esempio echo $ GIT_DIR è quello che dovrebbe essere). Sono andato alla cartella che ho voluto creare il repository git per, diciamo c: \ www, e poi corse:Perché visualizzo il messaggio "irreversibile: questa operazione deve essere eseguita in un albero di lavoro?"

git init 
git add . 

allora ottengo l'errore:

fatal: This operation must be run in a work tree 

io non sono sicuro che cosa è andato storto, ma la directory c: \ Git ha un file di configurazione che dice:

[core] 
    repositoryformatversion = 0 
    filemode = false 
    bare = true 
    symlinks = false 
    ignorecase = true 

sono abbastanza sicuro che questo non dovrebbe essere nudi e questo è il nostro problema.

+1

GIT_DIR è un concetto completamente diverso rispetto a CVSROOT! – innaM

risposta

38

Il motivo diretto dell'errore è che sì, è impossibile utilizzare git-add con un repository vuoto. Un repository nudo, per definizione, non ha un albero di lavoro. git-add prende i file dall'albero di lavoro e li aggiunge all'indice, in preparazione per l'invio.

Potrebbe essere necessario mettere un po 'di pensiero nella configurazione qui, però. GIT_DIR è la directory del repository utilizzata per tutti i comandi git. Stai davvero provando a creare un unico repository per tutto ciò che traccia, forse cose su tutto il tuo sistema? Un repository git per natura tiene traccia del contenuto di una singola directory. Dovrai impostare GIT_WORK_TREE in un percorso che contenga tutto ciò che desideri monitorare e quindi avrai bisogno di un .gitignore per bloccare tutto ciò che non ti interessa monitorare.

Forse stai cercando di creare un repository che traccia solo c:\www? Quindi dovresti inserirlo in c:\www (non impostare GIT_DIR). Questo è il normale uso di git, con il repository nella directory .git della directory di primo livello del tuo "modulo".

A meno che non si abbia una buona ragione, consiglierei di attenersi al modo in cui a Git piace lavorare. Se hai molte cose da tenere traccia, probabilmente vorrai più repository!

+7

1. Stiamo solo seguendo 'Everyday GIT in 20 commands' e git-init (1) manpPage di Linus T. (che sfortunatamente potrebbe essere obsoleto?) 2. Il tuo post suggerisce solo ciò che è sbagliato ma ci dà nessun indizio su cosa fare a riguardo –

+29

Basta 'git config --unset core.bare'. –

6

L'impostazione esplicita della variabile di ambiente GIT_DIR obbliga git a utilizzare la directory specificata come repository git. Non è mai necessario durante il normale utilizzo.

Nel tuo esempio, perché hanno specificato un GIT_DIR e non si chiama .git (il punto iniziale è importante) e non hanno fornito un'opzione di --work-tree o impostare la variabile GIT_WORK_TREE ambiente, che si desidera un repository nudo quando hai detto git init.

Poiché un repository non ha un albero di lavoro, una vasta selezione di comandi non ha senso con un repository spoglio. git add è solo uno.

Esiste un motivo particolare per cui è necessario utilizzare un percorso non standard per il repository git, piuttosto che in una sottocartella .git nella radice dell'albero di lavoro? Mentre è possibile organizzare questo tende ad essere più lavoro e più suscettibile agli errori dell'utente.

4

creare un repository GIT nuda

Una piccola rant: git non è in grado di creare un normale repository a nudo da solo. Stupido idiota davvero.

Per la precisione, non è possibile clonare i repository vuoti.Quindi un repository vuoto è un repository inutile. Infatti, normalmente si crea un repository vuoto e subito riempirlo:

git init 
git add . 

Tuttavia, git add non è possibile quando si crea un bare repository:

git --bare init 
git add . 

dà un errore "fatale: questa operazione deve essere eseguito in un albero di lavoro ".

Non puoi controllarlo fuori uno:

Initialized empty Git repository in /home/user/myrepos/.git/ 
fatal: http://repository.example.org/projects/myrepos.git/info/refs not found: did you run git update-server-info on the server? 

git --bare init 
git update-server-info # this creates the info/refs file 
chown -R <user>:<group> . # make sure others can update the repository 

La soluzione è quella di creare un altro repository altrove, aggiungere un file in quel repository e, spingerlo al repository nudo.

mkdir temp; cd temp 
git init 
touch .gitignore 
git add .gitignore 
git commit -m "Initial commit" 
git push (url or path of bare repository) master 
cd ..; rm -rf temp 

la speranza che questo può aiutare u

+1

Questo è falso non vero. È possibile creare un repository nudo e clonarlo. Anche se fosse vero, non risponde ancora alla domanda. (Ad esempio '$ git --bare init bare.git'' Inizializzato repository Git vuoto in/home18/cbailey/gittest8/bare.git/'' $ git clone bare.git non nudo ''Clonazione in' non-bare ' ... \\ done. \\ warning: Sembra che tu abbia clonato un repository vuoto. –

+0

Mi dispiace, se uso "<>" per impacchettare "url o percorso del repository nudo", sarà invisibile. e quello che ho detto al rialzo è davvero utile. Ho provato e verificato me stesso. – user1329261

103

Inoltre, si sono probabilmente all'interno della sottocartella .git, salire una cartella a vostra principale del progetto.

6

Proprio clone lo stesso progetto in un'altra cartella e copiare il cartella/.git al progetto.

Esempio

creare la cartella Temp:

mkdir temp 

interruttore per temperatura cartella

cd temp/ 

clone lo stesso progetto nella cartella Temp :

git clone [-b branchName] [email protected]_to_your_git_repository 

Copia cartella .git al projet:

cp -R .git/ path/to/your/project/

switch per il vostro progetto ed eseguire git status

eliminare la cartella Temp se la sono finiti.

speranza che questo vi aiuterà qualcuno

+1

Ho trovato questo utile, ma devo dire che la prima riga è stata sufficiente per farmi capire cosa c'era che non andava. un po ', grazie mille comunque :) – randombee

9

Solo nel caso quello che è successo a me sta accadendo a qualcun altro, ho bisogno di dire questo: ero nella mia directory .git all'interno del mio progetto quando mi è stato sempre questo errore. Ho cercato e setacciato le risposte, ma non ha funzionato. Tutto quello che dovevo fare era tornare alla directory giusta. Per me è stata una specie di momento del palmo della mano. Nel caso ci fosse qualcun altro là fuori da stupido come me, spero che abbia trovato utile questa risposta.

+1

esperienza simile. Nel mio caso stavo usando GitExtensions (per Windows), e nel tentativo di aprire il repository, avevo cliccato per aprire il file .git invece della cartella contenente. All'inizio sembrava buono, ma mi ha dato l'errore dell'albero quando ho iniziato a fare effettivamente qualcosa. – thund

0

Se nessuno dei modi consueti sopra descritti è di aiuto, consultare la traccia di chiamata sotto questo messaggio di errore ("fatal: This operation . . .") e individuare lo script e la riga che sta generando l'errore effettivo. Una volta individuata la chiamata error(), disattivala e verifica se l'operazione che stai tentando si completa anche con alcuni avvisi/messaggi - ignorali per ora.Se è così, finalmente dopo averlo completato potrebbe menzionare la parte dell'operazione che non è stata completata con successo. Ora, indirizza questa parte separatamente come applicabile.

Riguardando la logica di cui sopra per il mio caso, stavo ricevendo questo messaggio di errore "fatal: This operation . . ." quando stavo cercando di ottenere il codice di Android-x86 con repo sync . . .. e la traccia di chiamata ha mostrato raise GitError("cannot initialize work tree") come la chiamata error() che ha causato il messaggio di errore sopra riportato ("fatal: . . ."). Quindi, dopo aver commentato che GitError() in .repo/repo/project.py, repo sync . . . continuava e infine indicato errore per tre progetti che non erano correttamente sincronizzati. Ho appena eliminato localmente le loro cartelle *.git dai loro percorsi rilevanti nell'albero dei sorgenti Android-x86 e ho eseguito nuovamente repo sync . . . e ho avuto un buon successo!

0

Ho riscontrato questo problema perché .git/config contiene worktree = D:/git-repositories/OldName. Ho appena cambiato in worktree = D:/git-repositories/NewName

ho scoperto che, perché ho usato git gui, che ha mostrato un messaggio di errore più dettagliato:

git gui error

-1

Stesso problema che ho avuto, ho fatto seguenti operazioni,

  1. git init
  2. git add.
  3. git commit -m "setup iniziale che"
  4. git push -f origine maestro

allora il lavoro inizia a lavorare.

Problemi correlati