git --git-dir이 예상대로 작동하지 않습니다


209

현재와 ​​다른 디렉토리에서 git을 실행하려고합니다. 예를 들어 다음과 같은 경우 :

cd /home/domain/
git status << runs perfect ie
# On branch master
# Your branch is ahead of 'origin/master' by 6 commits.

이제 --git-dir옵션을 사용하여 다른 디렉토리에서이 명령을 실행하려고합니다 .

그래서 내가 있다고 말하고 이것을 root/시도하십시오 :

git --git-dir="/home/domain/" status
## Error 
fatal: Not a git repository: '/home/domain/'

나는 또한 .git폴더 를 포함하려고했습니다.

git --git-dir="/home/domain/.git/" status

그러나 이것은 루트에서 git을 실행하려고하는 것처럼 보입니다. 즉, 내 도메인 폴더에서 모든 것을 삭제하고 루트에 모든 것을 추가하는 것입니다.

누군가 내가 뭘 잘못하고 있는지 조언 할 수 있기를 바랍니다.


4
이제 상태가 완벽하게 작동하지만 풀이 오류를 발생시킵니다. 즉 root @ erx [/] # git --git-dir = / home / domain / .git --work-tree = / home / domain / pull origin master 치명적 : / usr / local / libexec / git-core / git 작업 트리가 없으면 -pull을 사용할 수 없습니다. 그러나 상태가 작동합니까 ?? 모든 아이디어 Jon
Lee

4
이것은 현재 자식에서 가장 큰 버그입니다. --work-tree 및 / 또는 --git-dir 매개 변수를 존중하지 않습니다.
Adam Dymitruk

5
자식 1.8.5을 시작, 당신이 할 수있는 선택을해야합니다 하지 설정을 --git-dir하고 --work-tree간단한 명령은 다음을 참조 내 대답은 아래
VonC

답변:


314

작업 디렉토리도 정의해야합니다. 혼란 스럽지만 유연성이 있습니다.

git --git-dir=/mycode/.git --work-tree=/mycode status

여기서 조금 더 읽을 수 있습니다


3
고마워요! 이것이 혼란 스럽다는 것에 동의했습니다. 그것은 간단한 바보 유지라고합니다. 거의 항상 유연성을 허용하면서 동시에 명령이 전혀 작동하지 않는 VS에 가장 적합한 기본값을 지정하십시오.
Nay

3
@ 닉 동의, 당신 --git-dir은 지정되지 않은 경우, /mycode/.git존재 여부를 확인 하고 오류를 던지기 전에 그것을 사용할 것이라고 생각합니다 .
GP89

4
@NickYeates 두 번째! 또한 ~를 사용하여 홈 디렉토리를 참조 할 때 문제가 발생했습니다. 예를 들어 git --git-dir=~/src/s3cmd/.git --work-tree=~/src/s3cmd pull작동하지는 git --git-dir=/home/username/src/s3cmd/.git --work-tree=/home/username/src/s3cmd pull않았지만
Jamie Cook

1
모든 명령에 작업 트리가 필요한 것은 아닙니다 (예 : "git --git-dir = / mycode / .git log"). 그래도 혼란 스럽습니다!
yoyo 2016 년

4
리틀 설명 : git --git-dir="$HOME/foo/.git" --work-tree="$HOME/foo" status
하리스 크라

136

git 1.8.5 (다음 주에 나올 예정) 부터 시작 하면 훨씬 간단합니다.

 git -C "/home/domain/" status

필요가 없습니다 세트 --git-dir--work-tree더 이상!


참조 44e1e4 커밋 에 의해 Nazri Ramliy :

현재 디렉토리를 떠나지 않고 다른 디렉토리에서 git 명령을 호출하려면 더 많은 키를 누르십시오.

  1. (cd ~/foo && git status)
    git --git-dir=~/foo/.git --work-dir=~/foo status
    GIT_DIR=~/foo/.git GIT_WORK_TREE=~/foo git status
  2. (cd ../..; git grep foo)
  3. for d in d1 d2 d3; do (cd $d && git svn rebase); done

위에 표시된 방법은 스크립팅에는 적합하지만 빠른 명령 행 호출에는 너무 번거 롭습니다.

이 새로운 옵션을 사용하면 적은 키 입력으로 위의 작업을 수행 할 수 있습니다.

  1. git -C ~/foo status
  2. git -C ../.. grep foo
  3. for d in d1 d2 d3; do git -C $d svn rebase; done

4
나는 -C 플래그를 사용하려고 트립있어 후에 망할 놈의 명령 (예를 들어 git status -C <path>하지 않습니다 작품!)
게달 Paranjape

42

위의 의견을 바탕으로 여전히 문제가 발생하는 것 같습니다.

root @ erx [/] # git --git-dir = / home / domain / .git --work-tree = / home / domain / 풀 원점 마스터
치명적 : / usr / local / libexec / git-core / git-pull은 작업 트리 없이는 사용할 수 없습니다

당신이 crontab무언가 를 실행하려고하는 것처럼 들립니다 . cd먼저 작업 디렉토리로 전환하는 것이 더 나을 수 있습니다 . 예를 들면 다음과 같습니다.

root @ erx [/] # (cd / home / 도메인 및 git pull origin master)

이것은 괄호가하는 서브 쉘에서 일시적으로 현재 디렉토리를 /home/domain로 바꾼 다음 실행 git pull origin master합니다. 명령이 완료된 후 현재 디렉토리는 명령 이전의 모든 디렉토리로 유지됩니다.


서브 쉘을 사용하는 것은 간단하고 우아합니다. 내가 왜 그런 생각을하지 않았는지 모르겠어요!
Ehtesh Choudhury

죄송합니다 @Greg, Jon이 질문에 답변 한 다른 답변을 투표했습니다. 그러나 귀하는 의도와 귀하의 통찰력, 즉 ()를 발견하고 대답하는 데 집중하고 있다고 생각합니다. +10
대런 주교

1
git --git-dir="/home/domain/" status
## Error 
fatal: Not a git repository: '/home/domain/'

Git 2.26 (Q1 2020)을 사용하면 문서가 더 명확 해집니다.

(가) 위치를 지정의 효과 중 하나 GIT_DIR입니다 (중 환경 변수, 또는 "와 git --git-dir=<where> cmd"옵션)하는 것입니다 저장소 검색을 해제 .

새로운 사용자가 종종 혼란에 빠지기 때문에 문서에 약간의 스트레스가 가해졌습니다.

Heba Waly ( )의 commit d82ad54 (2020 년 1 월 30 일)를 참조하십시오 . (의해 병합 Junio C 하마노 - -17e4a1b 커밋 12 이월 2020)HebaWaly
gitster

git: --git-dir 설명서 업데이트

서명 : Heba Waly
도움 : Junio ​​C Hamano

git --git-dir <path> 약간 혼란스럽고 때로는 사용자가 기대하는대로 작동하지 않습니다.

예를 들어, 사용자 git --git-dir=<path> status가을 실행 하면 git은 저장소 검색 알고리즘을 건너 뛰고 달리 지정하지 않는 한 작업 트리를 사용자의 현재 작업 디렉토리에 할당합니다.
이 할당이 잘못되면 출력이 사용자의 기대와 일치하지 않습니다.

이 패치는보다 명확하게 문서를 업데이트합니다.

따라서 현재 문서git --git-dir 에는 다음이 포함됩니다.

--git-dir=<path>:

저장소 ( " .git"디렉토리) 의 경로를 설정하십시오 . 환경 변수
를 설정하여 제어 할 수도 있습니다 GIT_DIR.
현재 작업 디렉토리에 대한 절대 경로 또는 상대 경로 일 수 있습니다.

.git이 옵션 (또는 GIT_DIR환경 변수)을 사용하여 " "디렉토리 의 위치를 ​​지정하면 " .git"서브 디렉토리 (리포지토리 및 작업 트리의 최상위 레벨을 발견하는 방법)가있는 디렉토리를 찾으려고하는 저장소 발견이 꺼집니다. 그리고 Git에게 작업 트리의 최상위 레벨에 있다고 알려줍니다.

작업 트리의 최상위 디렉토리에 있지 않다면 Git에게 작업 트리의 최상위 위치를 --work-tree=<path>옵션 또는 GIT_WORK_TREE환경 변수 와 함께 알려 주어야합니다.

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