2009-09-21 25 views
41

Nur git unter Windows installiert. Ich setze die Variable GIT_DIR auf c: \ git \ und vergewissere mich, dass diese Umgebungsvariable von cygwin verwaltet wird (d. H. Echo $ GIT_DIR ist, wie es sein sollte). Ich ging in den Ordner, den ich für den GIT-Repository erstellen wollte, lassen Sie uns c sagen: \ www, und dann lief:Warum bekomme ich die Nachricht "fatal: Dieser Vorgang muss in einem Arbeitsbaum ausgeführt werden?"

git init 
git add . 

Dann bekomme ich den Fehler:

fatal: This operation must be run in a work tree 

Ich bin nicht sicher, was schief gelaufen ist, aber das c: \ git Verzeichnis hat eine Konfigurationsdatei, die sagt:

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

ich bin mir ziemlich sicher, dass dies nicht kahl sein sollte, und das ist unser Problem.

+1

GIT_DIR ist ein völlig anderes Konzept als CVSROOT! – innaM

Antwort

38

Der direkte Grund für den Fehler ist, dass es ja unmöglich ist, git-add mit einem bloßen Repository zu verwenden. Ein leeres Repository hat definitionsgemäß keinen Arbeitsbaum. git-add nimmt Dateien aus dem Arbeitsbaum und fügt sie dem Index als Vorbereitung für das Commit hinzu.

Sie müssen hier allerdings ein wenig nachdenken. GIT_DIR ist das Repository-Verzeichnis, das für alle Git-Befehle verwendet wird. Versuchen Sie wirklich, ein einziges Repository für alles, was Sie verfolgen, zu erstellen, vielleicht Dinge überall auf Ihrem System? Ein Git-Repository von Natur aus verfolgt den Inhalt eines einzelnen Verzeichnisses. Sie müssen GIT_WORK_TREE auf einen Pfad setzen, der alles enthält, was Sie verfolgen möchten, und dann brauchen Sie eine .gitignore, um alles zu blockieren, an dem Sie nicht interessiert sind.

Vielleicht möchten Sie ein Repository erstellen, das nur c:\www verfolgt? Dann sollten Sie es in c:\www setzen (GIT_DIR nicht setzen). Dies ist die normale Verwendung von Git, mit dem Repository im .git-Verzeichnis des Top-Level-Verzeichnisses Ihres "Moduls".

Es sei denn, Sie haben einen wirklich guten Grund, ich würde empfehlen, mit der Art zu bleiben, wie git gerne arbeitet. Wenn Sie mehrere Dinge zu verfolgen haben, möchten Sie wahrscheinlich mehrere Repositories!

+7

1. Wir folgen nur dem "Everyday GIT in 20 Befehlen" und git-init (1) manpPage von Linus T. (was leider veraltet sein könnte?) 2. Ihr Beitrag schlägt nur vor, was falsch ist, aber uns gibt keine Ahnung, was zu tun ist –

+29

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

6

Das explizite Festlegen der Umgebungsvariablen GIT_DIR zwingt Git, das angegebene Verzeichnis als Git-Repository zu verwenden. Es wird nie während des normalen Gebrauchs benötigt.

In Ihrem Beispiel, weil ein GIT_DIR angegeben hat und es nicht gestattet .git (der führenden Punkt ist wichtig), und Sie haben eine --work-tree Option oder setzen Sie das GIT_WORK_TREE Umgebungsvariable nicht vorgesehen ist, dass Sie mit einem nackten Repository wollen, wenn Du hast gesagt git init.

Da ein blankes Repository keinen funktionierenden Baum hat, ist eine große Auswahl an Befehlen bei einem blanken Repository nicht sinnvoll. git add ist nur eins.

Gibt es einen besonderen Grund, dass Sie einen nicht standardmäßigen Speicherort für Ihr Git-Repository verwenden müssen, anstatt in einem .git-Unterordner unter dem Stamm der Arbeitsbaumstruktur? Während es möglich ist, dies zu arrangieren, ist es tendenziell mehr Arbeit und eher anfällig für Benutzerfehler.

4

Erstellen einer nackte GIT-Repository

Eine kleine Tirade: git nicht in der Lage ist, ein normales nacktes Repository selbst zu erstellen. Blöder Schwachsinn in der Tat.

Um genau zu sein, ist es nicht möglich, leere Repositories zu klonen.Ein leeres Repository ist also ein nutzloses Repository. Tatsächlich erstellen Sie in der Regel ein leeres Repository und sofort füllen:

git init 
git add . 

jedoch git add ist nicht möglich, wenn Sie mit einem nackten Repository erstellen:

git --bare init 
git add . 

gibt einen Fehler „fatal: Dieser Vorgang muss in einem Arbeitsbaum laufen ".

Sie können es nicht, entweder:

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 

Die Lösung ist ein weiteres Repository an anderer Stelle, fügen Sie eine Datei in das Repository und schieben Sie es auf den blanken Repository zu erstellen.

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 

Hoffnung kann dies u Auch

+1

Das ist einfach unwahr. Sie können ein leeres Repository erstellen und es klonen. Auch wenn es wahr ist, wird die Frage immer noch nicht angesprochen. (ZB '$ git --bare init bare.git'' Initialisiertes leeres Git Repository in/home18/cbailey/gittest8/bare.git/'' $ git Klon bare.git nicht-bare' 'Klonen in 'nicht-bare' ... \\ done. \\ Warnung: Sie scheinen ein leeres Repository geklont zu haben. " –

+0

Es tut mir leid, wenn ich" <> "verwende, um die" URL oder den Pfad des nackten Repositorys "zu packen, wird es unsichtbar sein. und was ich oben gesagt habe, ist wirklich nützlich.Ich habe Test und verifiziere mich selbst. – user1329261

103

hilft, sind Sie wahrscheinlich in dem .git Unterordner, einen Ordner zu einem Projekt Wurzel nach oben bewegen.

6

Nur Klon das gleiche Projekt in einem anderen Ordner und kopieren die .git/ Ordner zu Ihrem Projekt.

Beispiel

erstellen Tempfaltblatt:

mkdir temp 

Schalter Temp Ordner

cd temp/ 

Klon das gleiche Projekt in der Temp Ordner:

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

kopieren .git Ordner auf Ihrem projet:

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

Schalter zu einem Projekt und führen git status

die Temp Ordner löschen, wenn Ihr fertig sind.

Hoffnung dies jemand

+1

Ich fand das nützlich, aber ich muss sagen, dass die erste Zeile genug war, um mir klar zu machen, was falsch war Wenig, vielen Dank jedenfalls :) – randombee

9

Nur für den Fall helfen wird, was passiert ist mir jemand anderem passiert, muss ich folgendes sagen: ich in meinem .git Verzeichnis in meinem Projekt war, als ich diesen Fehler bekam. Ich suchte und suchte nach Antworten, aber nichts funktionierte. Alles, was ich tun musste, war zurück zum richtigen Verzeichnis. Es war eine Art Moment für mich. Für den Fall, dass jemand anderer so dumm ist wie ich, hoffe ich, dass Sie diese Antwort hilfreich fanden.

+1

Ähnliche Erfahrung. In meinem Fall habe ich GitExtensions (für Windows) verwendet und beim Öffnen des Repositorys geklickt, um die .git-Datei anstelle des enthaltenen Ordners zu öffnen. Sah am Anfang gut aus, gab mir aber den Baumfehler, als ich anfing, tatsächlich etwas zu tun. – thund

0

Wenn Ihnen keine der oben genannten üblichen Möglichkeiten hilft, sehen Sie sich die Anrufverfolgung unter dieser Fehlermeldung an ("fatal: This operation . . .") und suchen Sie das Skript und die Zeile, die den eigentlichen Fehler verursacht. Sobald Sie diesen error() -Aufruf gefunden haben, deaktivieren Sie ihn und sehen Sie, ob die Operation, die Sie versuchen, auch mit einigen Warnungen/Nachrichten abgeschlossen ist - ignorieren Sie sie vorerst.Wenn dies der Fall ist, wird eventuell nach Abschluss des Vorgangs der Teil der Operation erwähnt, der nicht erfolgreich abgeschlossen wurde. Adressieren Sie diesen Teil nun separat.

Bezogen auf die Logik zu meinem Fall, bekam ich diese Fehlermeldung "fatal: This operation . . .", als ich versuchte, den Android-X86-Code mit repo sync . . . zu bekommen. und die Anrufablaufverfolgung zeigte raise GitError("cannot initialize work tree") als den Aufruf von Fehler(), der die obige Fehlermeldung ("fatal: . . .") verursacht. Also, nach dem Kommentieren, dass GitError() in .repo/repo/project.py, repo sync . . . fortgesetzt und schließlich angezeigt Fehler für drei Projekte, die nicht richtig synchronisiert wurden. Ich löschte gerade ihre *.git Ordner von ihren relevanten Pfaden im Android-x86 Quellbaum lokal und lief repo sync . . . wieder und schmeckte Erfolg!

0

Ich hatte dieses Problem, weil .git/config enthielt worktree = D:/git-repositories/OldName. Ich habe gerade es in worktree = D:/git-repositories/NewName

ich entdeckt, weil ich git gui verwendet, die eine detailliertere Fehlermeldung gezeigt:

git gui error

-1

gleiche Problem ich habe, habe ich folgende Schritte,

  1. git init
  2. git add.
  3. git commit -m "inital setup"
  4. git push -f origin master

dann zu arbeiten beginnt zu arbeiten.

Verwandte Themen