2014-01-26 7 views
3

나는 수십개의 repos를 가지고 있는데, 어떤 차이가 생기면, 내 커밋은 새 커밋, 새 태그, 새 분기가 있으면 스크립트에서 업데이트해야합니다. 내 경우에는 가져 오기가 수십 개의 리포지토리에 대해 느린 일이지만, 빠른 명령이 필요한지 여부를 알고 싶습니다.로컬 repo를 아는 방법은 가져 오지 않고 원격 repo와 다릅니다.

+0

diff 명령 사용 –

+0

라이브 서버의 자동 업데이트가 불량합니다 – exussum

+1

'가져 오기'가 없으면 git은 원격 저장소의 상태를 알지 못합니다. 'fetch'를 수행하지 않는 솔루션 (예 : 전체 원격 URL에 대해 'diff')은 적어도 원격 저장소의 상태를 검색해야하므로 '가져 오기'만큼 느릴 수 있습니다. – lanzz

답변

3

당신은 가져 오기없이 리모컨의 상태를 얻기 위해 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으로 생성하고 차례대로 각 리모트에서 작업해야 스크립트를 확장해야합니다.

+0

훌륭한 사운드! 내가 리모콘으로 밀어 넣는다면, 효과가 있습니까? 물론 rebase 아닙니다. – fifth

+0

예 브랜치 이름은 팁을 나타내는 별명 일뿐입니다. 즉, 객체 트리의 최상위 커밋입니다. 당신은 당신이 강제로 변경됩니다 팁을 누르면 LS-원격 목록이 팁, 그리고 원격의 스냅 샷 AA 다른 해시 값에 다른 해시를 볼 것이라는 점을 참조 할 수 있습니다, 따라서 전체 첫 번째 호출에 실행됩니다 가져 오기, 이후에는 아무 것도 없다. – mockinterface

2

당신은 당신 만 git 사용하지 않을 수 origin 서버

에 액세스 할 수 없습니다.

편집 다른 답변으로 당

, git ls-remote 당신에게 유용 할 수 있습니다.

그러나 모든 문제가 네트워크 지연 인 경우 ls-remote 모든 문제가 해결되면 ls-remote으로 해결되지 않습니다. 서버의 REPO에 쓰기가있을 때


당신은 origin 서버

  1. 설정 후크에 액세스 할 수 있습니다. 후크는 repo가 ​​수정 됨으로 표시합니다. 예를 들어 repo_name__MODIFIED 파일을 서버의 어딘가에 만들 수 있습니다.
  2. repo를 업데이트하기 전에 repo가 ​​수정되었는지 확인하십시오. 주어진 예제의 경우 repo_name__MODIFIED 파일이 서버에 있는지 확인하십시오.
  3. repo가 ​​수정 된 경우 repo를 업데이트하기 전에 수정되지 않은 것으로 표시합니다 (가져 오기 직전). 이 예에서는 단순히 서버의 repo_name__MODIFIED 파일을 삭제합니다.

왜 이렇게 오래 가져 오기입니까? git은 새로운 커밋을 가져오고 origin에 수정 사항이 없으면 매우 신속해야합니다! 당신이 git clone 또는 git remote add $REMOTE_NAME $REMOTE_URL, 당신은 (git fetch 마지막시) 자신의 원격 대응에 현지 지사를 비교하는 데 필요한 모든 정보를 사용하여 로컬 저장소를 설정 한 경우

+0

사실 내 빌드 머신의 repos의 수십 최신 코드를 얻으려면 가져올 것이다 가져 하나의 빠른했지만, 페치 (네트워크 요청)의 총 시간은 분 지속되었다. 그게 좋지 않거나, 건설 기계에 대한 나쁜 디자인 이었어. – fifth

+0

알았어. 그럼 내 해결책에 대해 어떻게 생각하니? 원본 서버에 액세스 할 수 있습니까? 더 많은 정보가 필요하면 더 발전시킬 수 있습니다. – Frizlab

+0

원본 서버에 액세스 할 수 있습니다. 귀하의 솔루션을 이해했습니다. 시도해 볼 가치가 있습니다. 감사합니다. – fifth

0

이미있다.

원격 추적 분기를 설정 한 경우 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 
+0

다른 태그가 다른 태그로 푸시 된 경우이 옵션이 작동하지 않습니다. git-status는 현재 작업중인 트리에서만 작동합니다. – fifth