IT

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

lottoking 2020. 3. 21. 10:46
반응형

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


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

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

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


시작 자식 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 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


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

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

이 게시물은 약간 낡았으므로 버그가있을 수 있으며 수정되었습니다.

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

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


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

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

pushd /X/Y
git pull
popd

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

pushd /X/Y; git pull; popd

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


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

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

원격 서버에서 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

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

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

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

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

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

한 줄에

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

또는 SSH를 통해.

ssh username@atyourserver.com -t "cd ~/Sites/thedir/web;git pull origin master"

참고 URL : https://stackoverflow.com/questions/5083224/git-pull-while-not-in-a-git-directory

반응형