자식 디렉토리에없는 동안 자식 풀


308

/X/Ygit 저장소 인 디렉토리가 있다고 가정 해 봅시다 . git pullinside 와 같은 명령을 호출 할 수는 /X있지만 /X/Y디렉토리를 대상으로 할 수 있습니까?

편집 : 나는 특별히 궁금해하고 있다고 생각합니다 : git 명령을 사용하여 디렉토리를 변경할 필요없이 이것을 할 수 있습니까?

참고 : 이전 옵션보다 훨씬 우아하기 때문에 VonC의 답변 을 수락 했습니다. 1.8.5보다 오래된 Git을 사용하는 사람들은 아래의 bstpierre의 답변을 참조 하십시오


2
후크 내에서 git-pull을 사용할 때 GIT_DIR을 설정 해제하지 않으면 작동하지 않는다는 것을 추가하고 싶습니다. 관련된.
zpmorgan

git 1.8.5 (Q4 2013)부터는 "git 명령을 사용할 수 있지만 디렉토리를 변경할 필요는 없습니다". 아래 답변을
VonC

답변:


453

시작 자식 1.8.5 (Q4 2013) , 당신은 "하지만 디렉토리를 변경하지 않고도 망할 놈의 명령을 사용"할 수있을 것입니다.

" make -C <directory>" 와 마찬가지로 , " git -C <directory> ..."는 Git에게 다른 일을하기 전에 그곳에 가라고 말한다 .

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

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

  1. (cd ~/foo && git status)
    git --git-dir=~/foo/.git --work-tree=~/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

힘내 2.3.4 (3 월 2015 년), 그리고 이후 6a536e2을 투입 하여 KARTHIK 나약 ( KarthikNayak) , git"취급 git -C '<path>'A와" 때 무 조작 <path>비어 있습니다.

' git -C ""'는 오류 " Cannot change to ''" 와 함께 도움이되지 않고 죽지 만, 쉘은 "" "를 no-op로 취급합니다.
쉘의 동작을 선례로 삼아 git-C "" '를 no-op로 취급하도록 가르치십시오 .


4 년 후, Git 2.23 (Q3 2019)에 ' git -C ""'작동하며 디렉토리를 변경하지 않는다는 문서

6a536e2 이후로 동작했습니다. ( git: 비어 있으면 " git -C '<path>'"를 no-op로 처리하십시오 <path>, 2015-03-06, Git v2.3.4).

, 현재 (최종적으로) 문서에 다음이 포함됩니다.

' <path>'가 있지만 비어있는 경우 (예 :) -C ""현재 작업중인 디렉토리는 변경되지 않습니다.


너는 볼 수있어 git -C예를 들어 Git 2.26 (Q1 2020)과 함께 사용되는 .

참조 b441717 커밋 , 9291e63 커밋 , 5236fce 커밋 , 10812c2 커밋 , 62d58cd 커밋 , b87b02c 커밋 , 9b92070 커밋 , 3595d10 커밋 , f511bc0 커밋 , 커밋 f6041ab , f46c243 커밋 , 99c049b 커밋 , 3,738,439 커밋 , 7,717,242 커밋 , b8afb90 커밋 (2019 12월 20일) 하여 덴 리우 ( Denton-L) .
(의해 병합 - Junio C 하마노 gitster-381e8e9 커밋 2,020 05 이월)

t1507: 인라인 full_name()

서명자 : Denton Liu

전에, 우리는 달렸다 test_must_fail full_name. 그러나 test_must_failgit 명령에서만 사용해야합니다.
인라인 full_name()우리가 사용할 수 있도록 test_must_failgit직접 명령을 입력합니다.

28fb84382b ( "Introduce notation", 2009-09-10, Git v1.7.0-rc0- merge ) full_name()에서 소개 되었을 때 옵션을 아직 사용할 수 없었습니다 ( 44e1e4d67d 에서 도입 되었으므로 ( " : 주어진 디렉토리에서 실행 ") with -C option ", 2013-09-09, Git v1.8.5-rc0- 일괄 처리 # 5에 나열된 병합 )). 결과적으로 도우미 기능은 매번 수동으로 작업 할 필요를 제거했습니다 . 그러나 지금 사용할 수 있으므로 대신 inline 사용할 수 있습니다 .<branch>@{upstream}git -Cgit
cdgit -Cfull_name()


6
좋은 와우! 이 방법은 더 우아하므로 앞으로 시청자에게 허용되는 것으로 표시하겠습니다.
Gavin Anderegg

1
나를 위해 작동하지 않습니다 : # git --version && git -C ~ / .m2 / checkout master git version 1.8.3.4 (Apple Git-47) 알 수없는 옵션 : -C 사용법 : git [--version] [--help ] [-c name = value] [--exec-path [= <path>]] [--html-path] [--man-path] [--info-path] [-p | --paginate | --no-pager] [--no-replace-objects] [--bare] [--git-dir = <path>] [--work-tree = <path>] [--namespace = <name> ] <command> [<args>]
Jan Galinski

7
@ JanGalinski하지만 "git 1.8.5 시작"에 대해서는 언급했습니다. 따라서 git 1.8.3.x는 해당 옵션에 대해 아직 알지 못합니다.
VonC

2
Ubuntu 12.04에서 최신 git 버전을 설치해야했습니다. 나는 이렇게했다 : apt-get install software-properties-common python-software-propertiesgit repo 추가하십시오 add-apt-repository ppa:git-core/ppa. 마지막 단계는 git :을 업데이트하는 것 apt-get update && apt-get upgrade입니다.
ph3nx


54

편집 :

에 버그가 git pull있거나 해당 명령으로 수행하려는 작업을 수행 할 수 없습니다. 그러나 가져 오기 및 병합으로 수행 할 수 있습니다 .

cd /X
git --git-dir=/X/Y/.git fetch
git --git-dir=/X/Y/.git --work-tree=/X/Y merge origin/master

원래 답변 :

bash 또는 이와 유사한 것을 실행한다고 가정하면 할 수 있습니다 (cd /X/Y; git pull).

자식 man 페이지는 어떤 변수들이 도움이 될 것처럼 보인다 ( "힘내 저장소"참조) 지정하지만 나는 그들이 (내 저장소에 / tmp를 / ggg2에) 잘 작동 할 수 없습니다 :

GIT_WORK_TREE=/tmp/ggg2 GIT_DIR=/tmp/ggg2/.git git pull
fatal: /usr/lib/git-core/git-pull cannot be used without a working tree.

내 cwd가 / po 업데이트 인 동안 아래 명령을 실행하면 업데이트 된 파일이 작업 트리 / tmp / ggg2 대신 / tmp에 나타납니다.

GIT_DIR=/tmp/ggg2/.git git pull

and 질문 을 보여주는 유사한 질문에 대한이 답변 도 참조하십시오 .--git-dir--work-tree


GIT_WORK_TREE 만 사용해 보셨습니까?
Arrowmaster

@Arrowmaster : 예, 그렇게하면 git은 .git디렉토리를 찾을 수 없습니다 .
bstpierre

아 맞다. 맨 페이지는 GIT_DIR이 설정되어 있지 않으면 GIT_WORK_TREE가 사용되지 않는다고 말한다. 둘 다 사용될 때 작동하지 않는 것이 이상하게 보입니다.
Arrowmaster

@Arrowmaster : 여기 어딘가에 버그가 있는지 궁금합니다. 그렇게 git --git-dir=/tmp/ggg2/.git --work-tree=/tmp/ggg2 pull하면 오류 메시지가 나타납니다. 그러나 git --git-dir=/tmp/ggg2/.git --work-tree=. pull/ tmp에 있는 동안 업데이트를 수행하면 업데이트 된 파일이 / tmp에 있어야합니다.
bstpierre

@bstpierre : 지금은 설치 자식있는 시스템에 액세스 할 수 없습니다하지만 난과 다른 대안을 시도 할 것했던 경우 --work-tree처럼 지금 --work-tree=/tmp/ggg2/--work-tree=/tmp/ggg2/.이후 그 경로를 분석하는 방법에 문제가있을 수 있습니다.
Arrowmaster

32

bash 스크립트 또는 자식 별칭으로 래핑 할 수 있습니다.

cd /X/Y && git pull && cd -

1
이것은 분명히 트릭을 수행하지만 디렉토리를 변경하지 않고 git 명령을 사용할 수있는 방법이 있는지 궁금합니다. 나는 없다고 생각하기 시작했습니다.
Gavin Anderegg

1
그리고 사용하는 pushd/popd대신 쌍cd/cd-
AXD

또는 서브 쉘을 사용하여 CD를 (cd xyz && git pull)
되찾지 않아도

30

이 게시물은 약간 낡았으므로 버그가있을 수 있으며 수정되었습니다.하지만 방금 이렇게했습니다.

git --work-tree=/X/Y --git-dir=/X/Y/.git pull origin branch

그리고 효과가있었습니다. 닷 파일과 부모 디렉토리가 필요하다는 것을 알기 위해 잠시 시간을 보냈습니다 (표준 설치에서는 항상 부모 / 자식이지만 모든 설정은 아니므로 명시 적으로 지정해야합니다.


이 솔루션은 \\ remotemachine \ C $ \ folder \ etc와 같은 디렉토리에서 작동하기 때문에이 솔루션을 좋아합니다
twasbrillig

7

내 서버 중 일부가 이전 Ubuntu LTS 버전에 있으므로 git을 최신 버전으로 쉽게 업그레이드 할 수 없습니다 (일부 답변에 설명 된 -C 옵션을 지원함).

이 트릭은 나를 위해 잘 작동합니다. 특히 시작한 곳과 다른 디렉토리에 다른 응답의 부작용이 없기 때문에 특히 효과적입니다.

pushd /X/Y
git pull
popd

또는 단일 라이너로 수행하십시오.

pushd /X/Y; git pull; popd

Linux와 Windows 모두 푸시 및 팝 명령을 수행했습니다.


5

조합을 사용하여 pushd, git pull그리고 popd우리가이 기능을 달성 할 수있다 :

pushd <path-to-git-repo> && git pull && popd

예를 들면 다음과 같습니다.

pushd "E:\Fake Directory\gitrepo" && git pull && popd

이것은 놀랍다. 완벽하게 작동
Stretch0

4

다음과 같은 스크립트를 작성할 수 있습니다.

cd /X/Y
git pull

이름을 다음과 같이 지정할 수 있습니다 gitpull.
오히려 대신에 임의의 디렉토리를 수행하십시오 /X/Y.

cd $1
git pull

그런 다음 gitpull /X/Z
마지막으로 호출하여 리포지토리를 찾을 수 있습니다. ~/git리포지토리가 포함 된 폴더가 있으며이 폴더를 사용하여 모든 폴더를 가져올 수 있습니다.

g=`find /X -name .git`
for repo in ${g[@]}
do
    cd ${repo}
    cd ..
    git pull
done

2
명령 행에서 수행하려면 서브 쉘에서 수행하십시오 (cd /X/Y && git pull).
Cascabel

2

나 같은 사람은 원격 서버에서 drush (Drupal shell) 명령을 통해이 작업을 시도했지만 작업 디렉토리에 CD를 넣으라는 솔루션을 사용할 수 없습니다.

대신 가져 오기 및 병합으로 끌어 당기는 솔루션을 사용해야합니다.

drush @remote exec git --git-dir=/REPO/PATH --work-tree=/REPO/WORKDIR-PATH fetch origin
drush @remote exec git --git-dir=/REPO/PATH --work-tree=/REPO/WORKDIR-PATH merge origin/branch

1

이것은 비슷한 문제 일 수 있지만 단순히 명령을 연결할 수도 있습니다. 예 :

한 줄에

cd ~/Sites/yourdir/web;git pull origin master

또는 SSH를 통해.

ssh username@atyourserver.com -t "cd ~/Sites/thedir/web;git pull origin master"
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.