2009-09-21 16 views
41

Właśnie zainstalowałem git w systemie Windows. Ustawiłem zmienną GIT_DIR na c: \ git \ i zweryfikowałem, że ta zmienna środowiskowa jest utrzymywana przez cygwin (tzn. Echo $ GIT_DIR jest tym, czym powinno być). Poszedłem do folderu Chciałem stworzyć repozytorium git do, powiedzmy c: \ www, a następnie prowadził:Dlaczego otrzymuję komunikat "fatal: ta operacja musi być uruchomiona w drzewie roboczym?"

git init 
git add . 

Potem pojawia się błąd:

fatal: This operation must be run in a work tree 

nie jestem pewien, co poszło nie tak, ale w katalogu C: \ git ma plik konfiguracyjny, który mówi:

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

Jestem całkiem pewien, że to nie powinno być nagi i to jest nasz problem.

+1

GIT_DIR to zupełnie inna koncepcja niż CVSROOT! – innaM

Odpowiedz

38

Bezpośrednim powodem błędu jest to, że tak, niemożliwe jest użycie git-add z gołym repozytorium. Nagie repozytorium z definicji nie ma drzewa roboczego. git-add pobiera pliki z drzewa pracy i dodaje je do indeksu, w ramach przygotowań do zatwierdzenia.

Być może trzeba jednak włożyć trochę uwagi w konfigurację. GIT_DIR jest katalogiem repozytoriów używanym dla wszystkich poleceń git. Czy naprawdę chcesz utworzyć pojedyncze repozytorium dla wszystkiego, co śledzisz, a może na całym systemie? Repozytorium git według natury śledzi zawartość pojedynczego katalogu. Musisz ustawić GIT_WORK_TREE na ścieżce zawierającej wszystko, co chcesz śledzić, a następnie będziesz potrzebować .gitignore, aby zablokować wszystko, co nie jest zainteresowane śledzeniem.

Być może próbujesz utworzyć repozytorium, które będzie śledzić tylko c:\www? Następnie powinieneś umieścić go w c:\www (nie ustawiaj GIT_DIR). Jest to normalne użycie git, z repozytorium w katalogu .git w katalogu najwyższego poziomu twojego "modułu".

Jeśli nie masz naprawdę dobrego powodu, polecam trzymać się tego, jak git lubi pracować. Jeśli masz kilka rzeczy do namierzenia, prawdopodobnie potrzebujesz kilku repozytoriów!

+7

1. Po prostu śledzimy "Everyday GIT w 20 komendach" i git-init (1) manpPage autorstwa Linusa T. (co niestety może być przestarzałe?) 2. Twój post sugeruje tylko, co jest nie tak, ale daje nam nie ma pojęcia, co z tym zrobić. –

+29

Po prostu 'git config --unset core.bare'. –

6

Jawnie ustawienie zmiennej środowiskowej GIT_DIR wymusza na git użycie podanego katalogu jako repozytorium git. Nigdy nie jest potrzebny podczas normalnego użytkowania.

W przykładzie, ponieważ nie określono GIT_DIR i nie jest nazwany .git (wiodąca kropka to ważne) i nie dostarczyły opcję --work-tree lub ustawić zmienną środowiskową GIT_WORK_TREE, że chcesz gołego repozytorium gdy jest powiedziałeś git init.

Ponieważ puste repozytorium nie ma działającego drzewa, duży wybór poleceń nie ma sensu w przypadku gołego repozytorium. git add to tylko jeden.

Czy istnieje szczególny powód, dla którego należy użyć niestandardowego położenia dla repozytorium git, a nie w podfolderze .git pod drzewem roboczym? Chociaż można to zorganizować, to jest to raczej praca i większa podatność na błędy użytkowników.

4

Tworzenie gołego repozytorium git

Mała rant: git jest w stanie stworzyć normalnego gołego repozytorium sama. Głupi dupek.

Nie ma możliwości sklonowania pustych repozytoriów.Zatem puste repozytorium jest bezużytecznym repozytorium. Rzeczywiście, normalnie utworzyć pusty repozytorium i natychmiast wypełnić go:

git init 
git add . 

Jednak git add nie jest możliwe podczas tworzenia gołego repozytorium

git --bare init 
git add . 

daje błąd „fatal: ta operacja musi być uruchomione w drzewie roboczym ".

Nie można to sprawdzić albo:

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 

Rozwiązaniem jest stworzenie innego repozytorium gdzie indziej, dodać plik w tym repozytorium i popchnąć go do gołego repozytorium.

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 

nadzieja to może pomóc u

+1

To nieprawda. Możesz stworzyć nieosłonięte repozytorium i sklonować je. Nawet jeśli to prawda, nadal nie odpowiada na pytanie. (Np. '$ Git --base init bare.git'' Zainicjowane puste repozytorium Git w/home18/cbailey/gittest8/bare.git/'' $ git clone bare.git non-bare' 'Cloning into 'non-bare' ... \\ done. \\ ostrzeżenie: Wygląda na to, że sklonowałeś puste repozytorium. –

+0

Przykro mi, jeśli użyję "<>" do spakowania "adresu URL lub ścieżki nagiego repozytorium", będzie to niewidoczne. i co mi powiedział Plusem jest naprawdę usefull.I mieć test i sprawdzić meself. – user1329261

103

Ponadto, prawdopodobnie jesteś wewnątrz podkatalogu .git, przejść o jeden folder do katalogu głównego projektu.

6

Wystarczy klon taki sam projekt w innym folderze i skopiować folderu .git/do projektu.

Przykład

Utwórz folder temp:

mkdir temp 

przełącznik do temp folderu

cd temp/ 

klon taki sam projekt w folderze temp:

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

skopiować .git folderu do Projet:

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

przełącznik do swojego projektu i uruchomienia git status

usuwać z folderu temp jeśli są zakończone.

nadzieję, że pomoże komuś

+1

znalazłem to przydatne, ale muszę powiedzieć, że pierwsza linia była na tyle, aby mi uświadomić sobie, co się stało. reszta to faktycznie mylić mnie Dziękuję bardzo i tak :) – randombee

9

wszelki wypadek, co mi się dzieje na kogoś innego, muszę to powiedzieć: byłam w katalogu .git w moim projekcie, kiedy otrzymuję ten błąd. Szukałem i szukałem odpowiedzi, ale nic nie działało. Jedyne, co musiałem zrobić, to wrócić do właściwego katalogu. To była dla mnie chwila na twarzy. Jeśli ktoś jest tak głupi jak ja, mam nadzieję, że ta odpowiedź była pomocna.

+1

Podobne doświadczenia. W moim przypadku korzystałem z GitExtensions (dla Windows) i próbując otworzyć repozytorium, kliknąłem, aby otworzyć plik .git zamiast folderu zawierającego. Na początku wyglądało to dobrze, ale spowodowało błąd drzewa, kiedy zacząłem robić cokolwiek. – thund

0

Jeśli żaden z powyższych zwykłych sposobów nie pomoże, należy sprawdzić śledzenie wywołania pod tym komunikatem o błędzie ("fatal: This operation . . .") i zlokalizować skrypt i linię, która podnosi rzeczywisty błąd. Po zlokalizowaniu tego wywołania error(), wyłącz je i sprawdź, czy operacja, którą próbujesz wykonać, nawet z niektórymi ostrzeżeniami/wiadomościami - zignoruj ​​je na razie.Jeśli tak, to w końcu po zakończeniu może wymienić część operacji, która nie została pomyślnie zakończona. Teraz, zaadresuj tę część osobno, jeśli dotyczy.

Odnosząc powyższą logikę do mojej sprawy, otrzymywałem ten komunikat o błędzie "fatal: This operation . . .", gdy próbowałem uzyskać kod Androida-x86 z repo sync . . .. i śledzenie wywołania pokazało raise GitError("cannot initialize work tree") jako wywołanie błędu() powodujące powyższy komunikat o błędzie ("fatal: . . ."). Tak więc, po komentowaniu, że GitError() w , kontynuował i ostatecznie wskazywał błąd dla trzech projektów, które nie zostały poprawnie zsynchronizowane. Właśnie usunąłem foldery *.git z odpowiednich ścieżek w drzewie źródłowym Androida-x86 i ponownie uruchomiłem repo sync . . . i odniosłem sukces!

0

miałem ten problem, ponieważ .git/config zawarte worktree = D:/git-repositories/OldName. Właśnie zmienił go w worktree = D:/git-repositories/NewName

odkryłem, że z powodu użyłem git gui, która pokazała bardziej szczegółowy komunikat o błędzie:

git gui error

-1

sam problem mam, zrobiłem następujące kroki,

  1. git startowych
  2. git dodać.
  3. git commit -m "przeczuciom setup"
  4. git pchania -f mistrza pochodzenia

to praca rozpoczyna pracę.

Powiązane problemy