나는 수십개의 repos를 가지고 있는데, 어떤 차이가 생기면, 내 커밋은 새 커밋, 새 태그, 새 분기가 있으면 스크립트에서 업데이트해야합니다. 내 경우에는 가져 오기가 수십 개의 리포지토리에 대해 느린 일이지만, 빠른 명령이 필요한지 여부를 알고 싶습니다.로컬 repo를 아는 방법은 가져 오지 않고 원격 repo와 다릅니다.
답변
당신은 가져 오기없이 리모컨의 상태를 얻기 위해 git ls-remote
배관 명령을 사용할 수 있습니다.
여기에서는 git 자체를 간단한 데이터베이스로 사용하여 원격 상태를 추적합니다.
다음을 스크립트에 넣으십시오. 편의를 위해 나중에 별칭 셸 함수로 사용할 수 있습니다. 레포 내부에서 실행하십시오.
REMOTE_SUM=$(git ls-remote --tags --heads 2>/dev/null | git hash-object --stdin)
if git cat-file -e $REMOTE_SUM
then
echo Remote check-summed up-to-date.
else
echo Remote changed, fetching...
git ls-remote --tags --heads 2>/dev/null | \
git hash-object -w --stdin &>/dev/null
git fetch
fi
필요한 오류 중 일부는 생략 확인하고, 코드는 명확 위해 중복되었다. 우리가 git hash-object --stdin
과를 통해 하나의 해시로 원격 REPO의 위의 사진을 해시
From /home/user/tmp/repo2 777201715768a4d82f374f7224e68164a916ac1f refs/heads/bar 78981922613b2afb6025042ff6bd878ac1994e85 refs/heads/master ...
차례로 : git ls-remote --tags --heads
모든 원격 팁 목록
설명
출력 등의 생성 이전에 git에서 해시에 대해 git cat-file -e
을 쿼리하여 확인했는지 확인합니다. 우리가 그것을 보지 않은 경우, 원격 사진을 변경해야합니다, 우리는 당겨 원격에 커밋 사이의 인종을 수용하기 위해, git hash-object -w
와 자식에 먼저 기록하고 리모컨을 가져 오기로 진행합니다.
하나는 기능 프리 페치 자식으로이를 통합 할 수 있습니다 : pre-fetch hook functionality in git를,하지만이 답변의 범위 밖이다. 위에서 때때로 쓰레기 git gc
으로 수집 될 필요가 느슨한 자식 오브젝트를 생성하고, 명시 가능한 --prune
것을
부록
참고. 커밋이 가지 팁은 동일하게 유지하는 방식으로 목적에 재 배열되지 않는 한
또한, 위에서 언급 한 작동합니다. 이것은 아주 드문 일 이겠지만 푸쉬 상태 변경에 대한 git 지침에 어긋나지 만, 이봐 요, 일어날 수있는 최악의 경우는 가져 오기를 건너 뛰는 것입니다.
또한 하나의 리모콘이 ls-remote
작품을 확인합니다. 여러 개의 리모컨으로 작업하려면 리모컨 목록을 git remote show
으로 생성하고 차례대로 각 리모트에서 작업해야 스크립트를 확장해야합니다.
훌륭한 사운드! 내가 리모콘으로 밀어 넣는다면, 효과가 있습니까? 물론 rebase 아닙니다. – fifth
예 브랜치 이름은 팁을 나타내는 별명 일뿐입니다. 즉, 객체 트리의 최상위 커밋입니다. 당신은 당신이 강제로 변경됩니다 팁을 누르면 LS-원격 목록이 팁, 그리고 원격의 스냅 샷 AA 다른 해시 값에 다른 해시를 볼 것이라는 점을 참조 할 수 있습니다, 따라서 전체 첫 번째 호출에 실행됩니다 가져 오기, 이후에는 아무 것도 없다. – mockinterface
당신은 당신 만 git
사용하지 않을 수 origin
서버
에 액세스 할 수 없습니다.
편집 다른 답변으로 당
, git ls-remote
당신에게 유용 할 수 있습니다.
그러나 모든 문제가 네트워크 지연 인 경우 ls-remote
모든 문제가 해결되면 ls-remote
으로 해결되지 않습니다. 서버의 REPO에 쓰기가있을 때
당신은 origin
서버
- 설정 후크에 액세스 할 수 있습니다. 후크는 repo가 수정 됨으로 표시합니다. 예를 들어
repo_name__MODIFIED
파일을 서버의 어딘가에 만들 수 있습니다. - repo를 업데이트하기 전에 repo가 수정되었는지 확인하십시오. 주어진 예제의 경우
repo_name__MODIFIED
파일이 서버에 있는지 확인하십시오. - repo가 수정 된 경우 repo를 업데이트하기 전에 수정되지 않은 것으로 표시합니다 (가져 오기 직전). 이 예에서는 단순히 서버의
repo_name__MODIFIED
파일을 삭제합니다.
주
왜 이렇게 오래 가져 오기입니까? git
은 새로운 커밋을 가져오고 origin
에 수정 사항이 없으면 매우 신속해야합니다! 당신이 git clone
또는 git remote add $REMOTE_NAME $REMOTE_URL
, 당신은 (git fetch
마지막시) 자신의 원격 대응에 현지 지사를 비교하는 데 필요한 모든 정보를 사용하여 로컬 저장소를 설정 한 경우
이미있다.
원격 추적 분기를 설정 한 경우 git status
은 추적중인 원격 분기와의 차이점을 알려줍니다.
$ git status
On branch master
Your branch is behind 'origin/master' by 1 commit, and can be fast-forwarded.
(use "git pull" to update your local branch)
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: perl/Makefile.am
no changes added to commit (use "git add" and/or "git commit -a")
또한 구문 분석 형태있다 :
$ git status --porcelain -b
## master...origin/master [behind 1]
M perl/Makefile.am
다른 태그가 다른 태그로 푸시 된 경우이 옵션이 작동하지 않습니다. git-status는 현재 작업중인 트리에서만 작동합니다. – fifth
diff 명령 사용 –
라이브 서버의 자동 업데이트가 불량합니다 – exussum
'가져 오기'가 없으면 git은 원격 저장소의 상태를 알지 못합니다. 'fetch'를 수행하지 않는 솔루션 (예 : 전체 원격 URL에 대해 'diff')은 적어도 원격 저장소의 상태를 검색해야하므로 '가져 오기'만큼 느릴 수 있습니다. – lanzz