"치명적 :이 작업은 작업 트리에서 실행해야합니다."라는 메시지가 나타나는 이유는 무엇입니까?


89

Windows에 git을 설치했습니다. GIT_DIR 변수를 c : \ git \로 설정하고이 환경 변수가 cygwin에 의해 유지되는지 확인했습니다 (즉, echo $ GIT_DIR이 있어야합니다). git 저장소를 만들려는 폴더 (c : \ www)로 이동 한 다음 실행했습니다.

git init
git add .

그런 다음 오류가 발생합니다.

fatal: This operation must be run in a work tree

무엇이 잘못되었는지 확실하지 않지만 c : \ git 디렉토리에는 다음과 같은 구성 파일이 있습니다.

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

나는 이것이 드러나서는 안되며 그것이 우리의 문제라고 확신합니다.


1
GIT_DIR은 CVSROOT와는 완전히 다른 개념입니다!
innaM

답변:


55

오류의 직접적인 이유는 예, git-add베어 리포지토리 에서는 사용할 수 없기 때문 입니다. 정의상 베어 저장소에는 작업 트리가 없습니다. git-add커밋을 준비하기 위해 작업 트리에서 파일을 가져와 색인에 추가합니다.

하지만 여기서 설정에 대해 약간의 생각을해야 할 수도 있습니다. GIT_DIR은 모든 git 명령에 사용되는 저장소 디렉토리입니다. 추적하는 모든 항목에 대해 단일 저장소를 만들려고하고 있습니까? 본질적으로 git 저장소는 단일 디렉토리의 내용을 추적합니다. GIT_WORK_TREE추적하려는 모든 항목이 포함 된 경로 를 설정 해야하며 .gitignore추적에 관심이없는 모든 항목을 차단 하려면이 필요합니다 .

어쩌면 당신은 단지 추적 할 저장소를 만들려고 시도하고 c:\www있습니까? 그런 다음 넣어야합니다 c:\www(GIT_DIR을 설정하지 마십시오). 이것은 "모듈"의 최상위 디렉토리의 .git 디렉토리에있는 저장소와 함께 git의 일반적인 사용법입니다.

정말 타당한 이유가 없다면 git이 일하는 것을 좋아하는 방식을 고수하는 것이 좋습니다. 추적 할 항목이 여러 개인 경우 여러 저장소를 원할 것입니다!


10
1. 우리는 Linus T의 'Everyday GIT in 20 commands'와 git-init (1) manpPage를 따를뿐입니다. 그것에 대해 무엇을 해야할지 단서

55
그냥 git config --unset core.bare.
Matthias Urlichs 2015 년

내 문제는 blj의 답변으로 해결되었지만 해당 하위 폴더 내에서 git branch명령 을 사용하여 분기를 나열 할 수 있었지만 할 수 없었습니다 git checkout -b feature22. 분기 를 나열 하려면 작업 트리가 필요하지 않지만 체크 아웃하려면 필요합니까?

206

또한 .git 하위 폴더 안에있을 수 있으므로 한 폴더 위로 프로젝트 루트로 이동합니다.


7
내가 본 최고의 대답! 받아 들여진 대답이어야합니다.
GeertVc

이것이 최고의 답변입니다. 나는 본 적이있다. 작은 문제. 작은 솔루션. 그것을 사랑하십시오.
Ariful Islam 201

2
이 메시지를 억제하는 방법이 있습니까?
roachsinai

19

그냥 다른 사람에게 무슨 일이 일어나고에 무슨 일이 일어 났는지 경우, 나는이 말을해야
내에서 있었다 .git나는이 오류가 발생되었을 때 내 프로젝트에서 디렉토리.
나는 답을 찾고 샅샅이 뒤졌지만 아무것도 효과가 없었다.
내가해야 할 일은 올바른 디렉토리로 돌아가는 것뿐이었습니다 ( cd .. ).
제게는 일종의 얼굴 손바닥 순간이었습니다.
저만큼 어리석은 사람이 있다면이 답변이 도움이 되었기를 바랍니다.


1
비슷한 경험. 제 경우에는 GitExtensions (Windows 용)를 사용하고 있었고 저장소를 열려고 할 때 포함 된 폴더 대신 .git 파일을 열기 위해 클릭했습니다. 처음에는 괜찮아 보였지만 실제로 무언가를 시작했을 때 트리 오류가 발생했습니다.
thund

1
나는 이것이 12 개의 찬성표를 가지고 있다는 것을 좋아합니다. 이 답변이 분명해 보였지만 게시하게되어 기쁩니다.
Jacob Zimmerman


12

그냥 복제 다른 폴더에 같은 프로젝트를하고 복사 .git / 프로젝트에 폴더를.

임시 폴더 만들기 :

mkdir temp

임시 폴더로 전환

cd temp/

임시 폴더 에서 동일한 프로젝트를 복제하십시오 .

git clone [-b branchName] git@path_to_your_git_repository

.git 폴더를 projet에 복사합니다.

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

프로젝트로 전환하고 실행 git status

완료되면 임시 폴더를 삭제 하십시오 .

이것이 누군가를 도울 수 있기를 바랍니다.


1
나는 이것이 유용하다는 것을 알았지 만 첫 번째 줄은 무엇이 잘못되었는지 깨닫기에 충분하다고 말해야합니다. 나머지 부분은 실제로 나를 약간 혼란스럽게했습니다. 많이 어쨌든 : 감사
randombee

@randombee 이것은 나를 위해 일했습니다. . . 그런데 왜? 이것은 무엇을합니까?
Yatharth Agarwal

8

GIT_DIR환경 변수를 명시 적으로 설정하면 git은 지정된 디렉토리를 git 저장소로 사용합니다. 정상적인 사용 중에는 필요하지 않습니다.

귀하의 예에서 a를 지정하고 GIT_DIR이름 이 지정 되지 않았고 .git(선행 점이 중요합니다) --work-tree옵션을 제공하지 않았 거나 GIT_WORK_TREE환경 변수를 설정 하지 않았기 때문에 git init.

베어 리포지토리에는 작동하는 트리가 없기 때문에 베어 리포지토리에서는 많은 명령을 선택하는 것이 의미가 없습니다. git add하나입니다.

.git작업 트리 루트 아래의 하위 폴더가 아닌 git 저장소에 비표준 위치를 사용해야하는 특별한 이유가 있습니까? 이를 조정하는 것이 가능하지만 작업이 더 많고 사용자 실수에 더 취약한 경향이 있습니다.


GIT_WORK_TREE를 설정하면 해결되었습니다. GIT_DIR을 사용하는 이유는 몇 분마다 추가 / 커밋하는 백그라운드 작업이있는 작업 복사본에 대해 별도의 git repo를 원하기 때문입니다. 이 프로세스는 GIT_DIR을 .gitsave로 설정합니다. 내 실제 repo 작업은 .git에 있습니다. 이제 로컬 라이브 추적 저장소가 있으므로 변경하는 모든 파일의 버전이 있습니다.
MikeJansen

6

베어 GIT 저장소 만들기

작은 폭언 : git은 자체적으로 일반 베어 저장소를 만들 수 없습니다. 참으로 멍청한 자식.

정확히 말하면 빈 저장소는 복제 할 수 없습니다. 따라서 빈 저장소는 쓸모없는 저장소입니다. 실제로 일반적으로 빈 저장소를 만들고 즉시 채 웁니다.

git init
git add .

그러나 베어 저장소를 생성 할 때는 git add가 불가능합니다.

git --bare init
git add .

"치명적 :이 작업은 작업 트리에서 실행되어야합니다"라는 오류가 발생합니다.

다음 중 하나를 확인할 수 없습니다.

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

해결책은 다른 리포지토리를 다른 곳에 만들고 해당 리포지토리에 파일을 추가 한 다음 베어 리포지토리로 푸시하는 것입니다.

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

이것이 당신을 도울 수 있기를 바랍니다


1
이것은 사실이 아닌 단순합니다. 베어 리포지토리를 생성하고 복제 할 수 있습니다. 사실이더라도 여전히 문제를 해결하지 못합니다. (예$ 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

죄송합니다. "<>"를 사용하여 "베어 저장소의 URL 또는 경로"를 패키징하면 보이지 않게됩니다. 그리고 내가 말한 것이 정말 유용하다 l. 나는 나를 테스트하고 검증했다.
user1329261

6

때문에 나는이 문제를 가지고 있었다 .git/config포함 worktree = D:/git-repositories/OldName. 나는 그것을worktree = D:/git-repositories/NewName

더 자세한 오류 메시지를 표시하는 git gui를 사용했기 때문에 발견했습니다 .

git gui 오류


1
나는 git bash를 사용하고 message를 받았습니다 fatal: this operation must be run in a work tree. 구성 파일을 수정하면 문제가 해결되었습니다.
pawellipowczan

4

제 경우에는 저장소의 ".git"파일과 동일한 폴더에있었습니다. 한 디렉토리 레벨을 올려야했는데 해결되었습니다.


2

다른 것이 작동하지 않는 것 같으면에서 경로를 다시 확인하십시오 git config core.worktree. 해당 경로가 작업 디렉토리를 가리 키지 않는 경우 업데이트해야 할 수 있습니다.

이 오류가 발생한 방법은 네트워크 드라이브에 Git 저장소를 만든 것입니다. 한 컴퓨터에서는 제대로 작동했지만 다른 컴퓨터에서는이 오류가 반환되었습니다. 내가 만든 컴퓨터의 Windows 드라이브 문자에 드라이브를 매핑했지만 다른 컴퓨터에는 매핑하지 않았으며 Git은 작업 트리의 경로를 UNC 경로가 아닌 매핑 ​​된 경로로 저장했습니다.


1

기존 (베어가 아닌) 체크 아웃에서이 오류가 발생하기 시작하면 .git / config 파일을 확인하십시오. 경우 core.bare사실, 그 설정 라인을 제거


0

위의 일반적인 방법 중 어느 것도 도움이되지 않으면이 오류 메시지 ( "fatal: This operation . . .") 아래의 호출 추적 을보고 실제 오류를 발생시키는 스크립트와 줄을 찾습니다. 해당 error () 호출을 찾으면 비활성화하고 시도중인 작업이 일부 경고 / 메시지와 함께 완료되는지 확인하십시오. 지금은 무시하십시오. 그렇다면 마지막으로 완료 후 성공적으로 완료되지 않은 작업 부분을 언급 할 수 있습니다. 이제 해당되는 경우이 부분을 개별적으로 처리합니다.

위의 논리를 내 경우와 관련하여 .NET을 사용 "fatal: This operation . . ."하여 Android-x86 코드를 가져 오려고 할 때이 오류 메시지가 표시 되었습니다 repo sync . . .. 호출 추적은 raise GitError("cannot initialize work tree")위의 오류 메시지 ( "fatal: . . .")를 일으키는 error () 호출로 표시 됩니다. 그래서, 그 주석 이후 GitError().repo/repo/project.py, repo sync . . .제대로 동기화되지 않은 세 가지 프로젝트를 위해 마지막으로 표시된 오류가 계속. *.gitAndroid-x86 소스 트리의 관련 경로에서 폴더를 로컬에서 삭제하고 repo sync . . .다시 실행 하여 성공을 맛 보았습니다!


0

내가 가진 동일한 문제, 다음 단계를 수행했습니다.

  1. 자식 초기화
  2. git add.
  3. git commit -m "초기 설정"
  4. git push -f origin master

그러면 작동이 시작됩니다.


0

구성 파일을 편집하고 bare = true를 bare = false로 변경했습니다.


0

또한이 오류는 NTFS Ram 드라이브로 복제하는 경우에 발생합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.