Warum erhalte ich die Meldung "Schwerwiegend: Dieser Vorgang muss in einem Arbeitsbaum ausgeführt werden?"

86

Gerade Git unter Windows installiert. Ich habe die Variable GIT_DIR auf c: \ git \ gesetzt und überprüft, ob diese Umgebungsvariable von cygwin verwaltet wird (dh echo $ GIT_DIR ist das, was es sein sollte). Ich ging zu dem Ordner, für den ich das Git-Repository erstellen wollte, sagen wir c: \ www, und führte dann Folgendes aus:

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 Verzeichnis c: \ git enthält eine Konfigurationsdatei mit der Aufschrift:

[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.

Bialecki
quelle
1
GIT_DIR ist ein völlig anderes Konzept als CVSROOT!
InnaM

Antworten:

54

Der direkte Grund für den Fehler ist, dass die Verwendung git-addmit einem nackten Repository nicht möglich ist. Ein nacktes Repository hat per Definition keinen Arbeitsbaum. git-addNimmt Dateien aus dem Arbeitsbaum und fügt sie dem Index hinzu, um das Festschreiben vorzubereiten.

Möglicherweise müssen Sie hier jedoch ein wenig über Ihr Setup nachdenken. GIT_DIR ist das Repository-Verzeichnis, das für alle Git-Befehle verwendet wird. Versuchen Sie wirklich, ein einziges Repository für alles zu erstellen, was Sie verfolgen, vielleicht für Dinge auf Ihrem gesamten System? Ein Git-Repository verfolgt von Natur aus den Inhalt eines einzelnen Verzeichnisses. Sie müssen GIT_WORK_TREEeinen Pfad festlegen , der alles enthält, was Sie verfolgen möchten, und dann müssen Sie einen Pfad .gitignoreblockieren, der alles blockiert, was Sie nicht verfolgen möchten .

Vielleicht versuchen Sie, ein Repository zu erstellen, das nur c:\wwwnachverfolgt? Dann sollten Sie c:\wwwes einfügen (setzen Sie nicht GIT_DIR). Dies ist die normale Verwendung von git, wobei sich das Repository im Verzeichnis .git des Verzeichnisses der obersten Ebene Ihres "Moduls" befindet.

Wenn Sie keinen guten Grund haben, würde ich empfehlen, bei der Art und Weise zu bleiben, wie Git gerne arbeitet. Wenn Sie mehrere Dinge verfolgen müssen, möchten Sie wahrscheinlich mehrere Repositories!

Cascabel
quelle
10
1. Wir folgen nur der 'Everyday GIT in 20 Befehlen' und der git-init (1) manpPage von Linus T. (die leider veraltet sein kann?) 2. Ihr Beitrag schlägt nur vor, was falsch ist, gibt uns aber keine Hinweis, was zu tun ist
55
Einfach git config --unset core.bare.
Matthias Urlichs
Mein Problem wurde durch die Antwort von blj behoben, aber in diesem Unterordner konnte git branchich mithilfe des Befehls Zweige auflisten, was ich jedoch nicht konnte git checkout -b feature22. Bedeutet das, dass zum Auflisten der Zweige kein funktionierender Baum benötigt wird, zum Auschecken jedoch?
Honig
204

Außerdem befinden Sie sich wahrscheinlich im Unterordner .git. Verschieben Sie einen Ordner nach oben in Ihr Projektstammverzeichnis.

blj
quelle
7
Beste Antwort, die ich gesehen habe! Sollte die akzeptierte Antwort sein.
GeertVc
Dies ist die beste Antwort. Die ich je gesehen habe. kleines Problem. kleine Lösung. Liebe es.
Ariful Islam
2
Gibt es eine Möglichkeit, diese Nachricht zu unterdrücken?
Roachsinai
17

Nur für den Fall, dass das, was mir passiert ist, jemand anderem passiert, muss ich Folgendes sagen: Ich befand mich in meinem .git-Verzeichnis in meinem Projekt, als ich diesen Fehler erhielt. Ich suchte und suchte nach Antworten, aber nichts funktionierte. Ich musste nur zum richtigen Verzeichnis zurückkehren. Für mich war es eine Art Gesichtspalmenmoment. Falls da draußen noch jemand so dumm ist wie ich, hoffe ich, dass Sie diese Antwort hilfreich fanden.

Jacob Zimmerman
quelle
1
Ähnliche Erfahrung. In meinem Fall habe ich GitExtensions (für Windows) verwendet und beim Versuch, das Repository zu öffnen, habe ich geklickt, um die .git-Datei anstelle des enthaltenen Ordners zu öffnen. Sah zuerst gut aus, gab mir aber den Baumfehler, als ich anfing, etwas zu tun.
Donnerstag,
1
Ich finde es toll, dass dies ein Dutzend positive Stimmen hat. Ich bin froh, dass ich diese Antwort gepostet habe, obwohl es irgendwie offensichtlich schien.
Jacob Zimmerman
12

Klonen Sie einfach dasselbe Projekt in einen anderen Ordner und kopieren Sie den Ordner .git / in Ihr Projekt.

Beispiel

Temporären Ordner erstellen:

mkdir temp

Wechseln Sie in den temporären Ordner

cd temp/

Klonen Sie dasselbe Projekt in den temporären Ordner:

git clone [-b branchName] git@path_to_your_git_repository

Kopieren Sie den .git-Ordner in Ihr Projekt:

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

Wechseln Sie zu Ihrem Projekt und führen Sie es aus git status

Löschen Sie den temporären Ordner, wenn Sie fertig sind.

hoffe, das wird jemandem helfen

Festus Tamakloe
quelle
1
Ich fand das nützlich, aber ich muss sagen, dass die erste Zeile ausreichte, um mir klar zu machen, was los war. Der Rest hat mich tatsächlich ein bisschen verwirrt.
Trotzdem
@ Randombee Das hat bei mir funktioniert. . . aber wieso? Was macht das?
Yatharth Agarwal
12

Dies sollte es lösen:

git config --unset core.bare
Babajide M. Moibi
quelle
5
Wenn Sie eine Lösung geben. Bitte erklären Sie auch warum.
Ich mache mein Zeichen
2
Dies hat das Problem für mich behoben.
Bpanulla
Es hat mir geholfen. Es ist mir egal warum :)
Jarda Pavlíček
8

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

In Ihrem Beispiel möchten Sie ein nacktes Repository, da Sie a angegeben haben GIT_DIRund es nicht benannt ist .git(der führende Punkt ist wichtig) und Sie keine --work-treeOption angegeben oder die GIT_WORK_TREEUmgebungsvariable festgelegt haben git init.

Da ein nacktes Repository keinen Arbeitsbaum hat, ist eine große Auswahl an Befehlen mit einem nackten Repository nicht sinnvoll. git addist nur einer.

Gibt es einen bestimmten Grund, warum Sie einen nicht standardmäßigen Speicherort für Ihr Git-Repository verwenden müssen und nicht in einem .gitUnterordner unter dem Arbeitsbaumstamm? Während es möglich ist, dies zu arrangieren, ist es tendenziell mehr Arbeit und anfälliger für Benutzerfehler.

CB Bailey
quelle
Das Setzen von GIT_WORK_TREE hat es für mich gelöst. Der Grund, warum ich GIT_DIR verwende, ist, dass ich ein separates Git-Repo für meine Arbeitskopie möchte, in dem ich eine Hintergrundaufgabe habe, die nur alle paar Minuten hinzugefügt / festgeschrieben wird. Dieser Prozess setzt GIT_DIR auf .gitsave. Meine eigentliche Repo-Arbeit ist in .git. Jetzt habe ich ein lokales Live-Tracking-Repo, sodass ich Versionen aller Dateien habe, wenn ich sie ändere.
MikeJansen
6

Erstellen Sie ein nacktes GIT-Repository

Ein kleiner Rant: Git ist nicht in der Lage, ein normales nacktes Repository selbst zu erstellen. Dummer Idiot in der Tat.

Um genau zu sein, ist es nicht möglich, leere Repositorys zu klonen. Ein leeres Repository ist also ein nutzloses Repository. Normalerweise erstellen Sie ein leeres Repository und füllen es sofort:

git init
git add .

Git Add ist jedoch nicht möglich, wenn Sie ein nacktes Repository erstellen:

git --bare init
git add .

gibt einen Fehler "fatal: Dieser Vorgang muss in einem Arbeitsbaum ausgeführt werden".

Sie können es auch nicht überprüfen:

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 besteht darin, ein anderes Repository an einer anderen Stelle zu erstellen, eine Datei in dieses Repository einzufügen und sie in das nackte Repository zu verschieben.

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

hoffe das kann dir helfen

user1329261
quelle
1
Das ist einfach falsch. Sie können ein nacktes Repository erstellen und es klonen. Auch wenn es wahr ist, wird die Frage immer noch nicht beantwortet. (ZB$ git --bare init bare.git Initialized empty Git repository in /home18/cbailey/gittest8/bare.git/ $ git clone bare.git non-bare Cloning into 'non-bare'... \\ done. \\ warning: You appear to have cloned an empty repository.
CB Bailey
Es tut mir leid, wenn ich "<>" verwende, um die "URL oder den Pfad des nackten Repositorys" zu verpacken, ist dies unsichtbar. und was ich oben gesagt habe, ist wirklich nützlich. Ich habe mich selbst getestet und verifiziert.
user1329261
6

Ich hatte dieses Problem, weil .git/configenthalten worktree = D:/git-repositories/OldName. Ich habe es einfach geändertworktree = D:/git-repositories/NewName

Ich habe das entdeckt, weil ich Git Gui verwendet habe , das eine detailliertere Fehlermeldung zeigte:

Git GUI Fehler

koppor
quelle
1
Ich habe Git Bash benutzt und eine Nachricht bekommen fatal: this operation must be run in a work tree. Das Ändern der Konfigurationsdatei hat das Problem für mich behoben.
Pawellipowczan
4

In meinem Fall befand ich mich für mein Repo im selben Ordner wie die ".git" -Datei. Ich musste ein Verzeichnis höher gehen, es löste es.

Chethan Jain
quelle
2

Wenn nichts anderes zu funktionieren scheint, überprüfen Sie den Pfad git config core.worktree. Wenn dieser Pfad nicht auf Ihr Arbeitsverzeichnis verweist, müssen Sie ihn möglicherweise aktualisieren.

Die Art und Weise, wie ich diesen Fehler bekam, war, dass ich ein Git-Repository auf einem Netzwerklaufwerk erstellt habe. Es funktionierte gut auf einem Computer, gab diesen Fehler jedoch auf einem anderen zurück. Es stellte sich heraus, dass ich das Laufwerk einem Windows-Laufwerksbuchstaben auf dem Computer zugeordnet hatte, auf dem ich es erstellt hatte, aber nicht auf dem anderen Computer, und Git speicherte den Pfad zum Arbeitsbaum als zugeordneten Pfad und nicht als UNC-Pfad.

Soren Björnstad
quelle
1

Wenn eine vorhandene (nicht nackte) Kasse diesen Fehler ausgibt, überprüfen Sie Ihre .git / config-Datei. Wenn dies der core.bareFall ist, entfernen Sie diese Konfigurationszeile

ThorSummoner
quelle
0

Wenn Ihnen keine der oben genannten Möglichkeiten hilft, überprüfen Sie die Anrufverfolgung unter dieser Fehlermeldung ( "fatal: This operation . . .") und suchen Sie das Skript und die Zeile, die den tatsächlichen Fehler auslösen. Sobald Sie diesen Aufruf von error () gefunden haben, deaktivieren Sie ihn und prüfen Sie, ob der von Ihnen versuchte Vorgang auch mit einigen Warnungen / Meldungen abgeschlossen ist. Ignorieren Sie sie vorerst. Wenn ja, wird nach Abschluss möglicherweise der Teil des Vorgangs erwähnt, der nicht erfolgreich abgeschlossen wurde. Behandeln Sie diesen Teil nun separat.

In Bezug auf die obige Logik zu meinem Fall wurde diese Fehlermeldung angezeigt, "fatal: This operation . . ."als ich versuchte, den Android-x86-Code mit zu erhalten repo sync . . .. und die Anrufverfolgung wurde raise GitError("cannot initialize work tree")als error () -Aufruf angezeigt, der die obige Fehlermeldung ( "fatal: . . .") verursacht. Also, danach zu kommentieren GitError()in .repo/repo/project.py, repo sync . . .fortgesetzt und schließlich angezeigten Fehler für drei Projekte , die nicht richtig synchronisiert wurden. Ich habe gerade ihre *.gitOrdner aus ihren relevanten Pfaden im Android-x86-Quellbaum lokal gelöscht und bin repo sync . . .erneut gelaufen und habe Erfolg gehabt!

geekie12
quelle
0

Das gleiche Problem, das ich bekam, habe ich folgende Schritte gemacht:

  1. git init
  2. git hinzufügen.
  3. git commit -m "inital setup"
  4. Git Push -f Ursprungsmaster

dann fängt es an zu arbeiten.

Raghavendra
quelle
0

Die Konfigurationsdatei wurde bearbeitet und bare = true in bare = false geändert

Murt Moriarty
quelle
0

Außerdem tritt dieser Fehler anscheinend auf, wenn Sie in NTFS Ram Drive klonen.

Mendi Barel
quelle