source

Git에서 당김이 필요한지 확인합니다.

manysource 2023. 5. 20. 10:55

Git에서 당김이 필요한지 확인합니다.

원격 리포지토리가 변경되었는지 확인하고 풀링해야 하는지 확인하려면 어떻게 해야 합니까?

이제 다음과 같은 간단한 스크립트를 사용합니다.

git pull --dry-run | grep -q -v 'Already up-to-date.' && changed=1

하지만 그것은 다소 무겁습니다.

더 좋은 방법이 있습니까?이상적인 솔루션은 모든 원격 분기를 확인하고 변경된 분기의 이름과 각 분기의 새 커밋 수를 반환하는 것입니다.

먼저 를 사용하여 원격 참조를 최신 상태로 전환합니다.그런 다음 다음과 같은 여러 가지 작업 중 하나를 수행할 수 있습니다.

  1. git status -uno추적 중인 분기가 앞에 있는지, 뒤에 있는지 또는 분기되었는지 여부를 알려줍니다.아무것도 표시되지 않으면 로컬과 원격이 동일합니다.

  2. git show-branch *master이름이 'master'로 끝나는 모든 분기의 커밋을 표시합니다(예: 마스터 및 오리진/마스터).

사용하는 경우-v와 함께git remote update(git remote -v update업데이트된 분기를 확인할 수 있으므로 추가 명령이 필요하지 않습니다.

그러나 스크립트나 프로그램에서 이 작업을 수행하여 true/false 값으로 끝나려는 것 같습니다.그렇다면 현재 헤드 커밋과 추적 중인 지점장 간의 관계를 확인할 수 있는 방법이 있습니다. 단, 네 가지 결과가 있을 수 있기 때문에 예/아니오로 줄일 수 없습니다.하지만, 만약 당신이 할 준비가 되어 있다면,pull --rebase그런 다음 "local is backdown" 및 "local has dividated"를 "당길 수 없음"으로 처리하고, 나머지 두 개("local is ahead" 및 "same")를 "당길 필요 없음"으로 처리할 수 있습니다.

당신은 수 .git rev-parse <ref>마스터 및 오리진/마스터대해 이 작업을 수행하고 비교할 수 있습니다.만약 그들이 같다면, 그 가지들은 같습니다.만약 그들이 불평등하다면, 당신은 어떤 것이 다른 것보다 앞서 있는지 알고 싶어합니다.사용.git merge-base master origin/master두 가지의 공통 조상을 알려줄 것이고, 두 가지가 갈라지지 않았다면 둘 중 하나 또는 다른 하나와 같을 것입니다.세 개의 다른 개체를 얻으면 가지가 갈라집니다.

이 작업을 제대로 수행하려면 스크립트에서 현재 분기와 추적 중인 원격 분기를 참조할 수 있어야 합니다. 롬트 의 bash /etc/bash_completion.d에는 지점 이름을 가져오는 데 유용한 코드가 있습니다.하지만, 여러분은 아마도 실제로 그 이름들을 얻을 필요가 없을 것입니다.Git에는 분기 및 커밋을 참조하기 위한 몇 가지 깔끔한 속기가 있습니다(에서 문서화됨).git rev-parse --help를할 수 특히 를 사용할 수 있습니다.@ 분기헤드) 및 (재리헤상아닌경태가우드assuming분) @{u}의 경우(예: 분예경우의기림트업스예(우경:▁(▁for▁its):origin/master. 그래서.git merge-base @ @{u}하고 " " " 과의▁at▁will▁return▁the커▁commit다▁("를 반환합니다.git rev-parse @그리고.git rev-parse @{u}두 가지 팁의 해시를 알려드리겠습니다.이는 다음 스크립트에서 요약할 수 있습니다.

#!/bin/sh

UPSTREAM=${1:-'@{u}'}
LOCAL=$(git rev-parse @)
REMOTE=$(git rev-parse "$UPSTREAM")
BASE=$(git merge-base @ "$UPSTREAM")

if [ $LOCAL = $REMOTE ]; then
    echo "Up-to-date"
elif [ $LOCAL = $BASE ]; then
    echo "Need to pull"
elif [ $REMOTE = $BASE ]; then
    echo "Need to push"
else
    echo "Diverged"
fi

참고: 이전 버전의 Git에서는 허용되지 않았습니다.@그 자체로, 그래서 당신은 아마도 사용해야 할 것입니다.@{0}대신.

UPSTREAM=${1:-'@{u}'}에서는 현재 분기에 대해 구성된 것과 다른 원격 분기를 확인하려는 경우 업스트림 분기를 명시적으로 전달할 수 있습니다.일반적으로 원격 이름/지점 이름 형식입니다.매개 변수가 지정되지 않은 경우 값은 다음과 같이 기본값으로 설정됩니다.@{u}.

스크립트는 사용자가 다음 작업을 수행했다고 가정합니다.git fetch또는git remote update첫째, 추적 분기를 최신 상태로 전환합니다.이것을 스크립트에 내장하지 않은 이유는 페치 작업과 비교 작업을 별도의 작업으로 수행하는 것이 더 유연하기 때문입니다. 예를 들어 최근에 페치했기 때문에 페치하지 않고 비교하려는 경우입니다.

업스트림 분기가 있는 경우

git fetch <remote>
git status

업스트림 분기가 없는 경우

두 분기를 비교합니다.

git fetch <remote>
git log <local_branch_name>..<remote_branch_name> --oneline

예:

git fetch origin

# See if there are any incoming changes
git log HEAD..origin/master --oneline

origin/master지점입니다).

위의 출력에 커밋이 나열되어 있으면 들어오는 변경사항이 있습니다. 병합해야 합니다.에 의해 이 없는 git log그러면 병합할 것이 없습니다.

분기에 합니다. 리모컨이 것은 에 있는 에도 작동합니다. 추적 리모컨이 없는 경우, 명시적으로 다음을 참조하기 때문입니다.origin/masterGit에 의해 기억되는 업스트림 브랜치를 암묵적으로 사용하는 대신.

스크립트용인 경우 다음을 사용할 수 있습니다.

git fetch
$(git rev-parse HEAD) == $(git rev-parse @{u})

(참고: 이전 답변과 비교하면 현재 분기 이름을 가져오는 데 별도의 명령이 필요하지 않다는 이점이 있습니다."HEAD"와 "@{u}"(현재 지점의 업스트림)가 이를 처리합니다.자세한 내용은 "git rev-parse --help"를 참조하십시오.)

명령어

git ls-remote origin -h refs/heads/master

원격에 현재 헤드가 나열됩니다. 이전 값과 비교하거나 로컬 레포에 SHA가 있는지 확인할 수 있습니다.

heavy와 한 Bash 무겁지 않습니다.git fetch또는git pull --dry-run필요한 작업:

[ $(git rev-parse HEAD) = $(git ls-remote $(git rev-parse --abbrev-ref @{u} | \
sed 's/\// /g') | cut -f1) ] && echo up to date || echo not up to date

이 다소 밀도가 높은 선은 다음과 같습니다.

  • 은 명은다음사그중룹첩고다니됩되화를 사용하여 및 됩니다.$(x)Bash 명령 대체 구문입니다.
  • git rev-parse --abbrev-ref @{u} 참조 약업트림참예조스어예)를 합니다(예:origin/master), 으로 구분된 sed 명령):origin master.
  • 이 문자열은 다음에 입력됩니다.git ls-remote원격 분기의 헤드 커밋을 반환합니다.이 명령은 원격 리포지토리와 통신합니다.피리 부는 사람cut명령은 첫 번째 필드(커밋 해시)만 추출하여 탭으로 구분된 참조 문자열을 제거합니다.
  • git rev-parse HEAD로컬 커밋 해시를 반환합니다.
  • 구문 Bash »[ a = b ] && x || y하나의 라이너를 완성합니다. 이것은 Bash 문자열 비교입니다. = 구성 에서.[ test ]에 및/가 나옵니다.&& true || false.

는 당신이 https://github.com/badele/gitcheck 스크립트를 보러 가는 것을 제안합니다.나는 당신의 모든 Git 저장소를 한 번에 확인하기 위해 이 스크립트를 코딩했고, 누가 커밋하지 않았는지, 누가 밀거나 당기지 않았는지 보여줍니다.

다음은 샘플 결과입니다.

여기에 이미지 설명 입력

아래 스크립트는 완벽하게 작동합니다.

changed=0
git remote update && git status -uno | grep -q 'Your branch is behind' && changed=1
if [ $changed = 1 ]; then
    git pull
    echo "Updated successfully";
else
    echo "Up-to-date"
fi

이를 위한 최선의 방법은 다음과 같습니다.

git diff remotes/origin/HEAD

이 refspec이 등록되어 있다고 가정합니다.저장소를 복제한 경우, 그렇지 않은 경우(즉, repo가 로컬에서 denovo로 생성되어 원격으로 푸시된 경우) refspec을 명시적으로 추가해야 합니다.

댓글에 놓치기 쉽기 때문에 실제 게시물로 올리고 싶을 뿐입니다.

이 질문에 대한 정확하고 최고의 답변은 @Jake Berger가 제공했습니다. 정말 감사합니다. 모든 사람이 이것을 필요로 하고 모든 사람이 댓글에서 이것을 놓칩니다.따라서 이 문제로 어려움을 겪고 있는 모든 사람에게 정답이 있습니다. 이 명령어의 출력을 사용하여 비트 풀을 수행해야 하는지 여부를 확인하십시오. 출력이 0이면 업데이트할 내용이 없습니다.

@이 사람에게 벨을 울리세요.고마워요 @ 제이크 버거

# will give you the total number of "different" commits between the two
# Jake Berger Feb 5 '13 at 19:23
git rev-list HEAD...origin/master --count

저는 @jberger의 코멘트를 바탕으로 이 솔루션을 만들었습니다.

if git checkout master &&
    git fetch origin master &&
    [ `git rev-list HEAD...origin/master --count` != 0 ] &&
    git merge origin/master
then
    echo 'Updated!'
else
    echo 'Not updated.'
fi

이미 매우 풍부하고 기발한 답변들이 많이 있습니다.약간의 대비를 제공하기 위해, 저는 매우 간단한 선으로 처리할 수 있습니다.

# Check return value to see if there are incoming updates.
if ! git diff --quiet remotes/origin/HEAD; then
 # pull or whatever you want to do
fi

저는 brool이 제안한 방법으로 하겠습니다.다음 한 줄 스크립트는 마지막으로 커밋된 버전의 SHA1을 사용하여 원격 오리진의 SHA1과 비교하고 변경 사항이 다른 경우에만 끌어옵니다.또한 이 제품은 다음을 기반으로 한 솔루션의 경량화를 실현합니다.git pull또는git fetch.

[ `git log --pretty=%H ...refs/heads/master^` != `git ls-remote origin
-h refs/heads/master |cut -f1` ] && git pull

스크립트를 에 이스립실면현분다필테요스다이니됩트성음이에기가 합니다.git pull:

#!/bin/bash

git fetch -v --dry-run 2>&1 |
    grep -qE "\[up\s+to\s+date\]\s+$(
        git branch 2>/dev/null |
           sed -n '/^\*/s/^\* //p' |
                sed -r 's:(\+|\*|\$):\\\1:g'
    )\s+" || {
        echo >&2 "Current branch need a 'git pull' before commit"
        exit 1
}

피하기 위해 깃훅 사전 커밋으로 넣는 것이 매우 편리합니다.

Merge branch 'foobar' of url:/path/to/git/foobar into foobar

이 가너언제▁you▁when제가commit 앞에pulling.

이 코드를 후크로 사용하려면 스크립트를 복사/붙여넣기만 하면 됩니다.

.git/hooks/pre-commit

그리고.

chmod +x .git/hooks/pre-commit

려달을 합니다.git fetch (remote)원격 참조를 업데이트하면 새로운 기능이 표시됩니다.그러면, 당신이 당신의 지역 지점을 확인할 때, 그것은 당신에게 그것이 상류 지역보다 뒤에 있는지를 보여줄 것입니다.

솔루션이 매우 짧고 간단할 때 이러한 모든 복잡한 제안:

#!/bin/bash

BRANCH="<your branch name>"
LAST_UPDATE=`git show --no-notes --format=format:"%H" $BRANCH | head -n 1`
LAST_COMMIT=`git show --no-notes --format=format:"%H" origin/$BRANCH | head -n 1`

git remote update
if [ $LAST_COMMIT != $LAST_UPDATE ]; then
        echo "Updating your branch $BRANCH"
        git pull --no-edit
else
        echo "No updates available"
fi

다음은 미리 정의된 폴더의 모든 리포지토리를 검사하는 Bash 스크립트 버전입니다.

https://gist.github.com/henryiii/5841984

풀 필요와 푸시 필요와 같은 일반적인 상황을 구별할 수 있으며 멀티 스레드이므로 한 번에 가져오기가 수행됩니다.풀 및 상태와 같은 여러 명령이 있습니다.

링크 폴더에 , 은 " " " " " " " " " " " " ( " " " ( " " " " " " " 로 합니다.git all status 등)오리진/마스터만 지원하지만 편집하거나 다른 메소드와 결합할 수 있습니다.

(@Stephen Haberman의 답변에서) 이 한 줄은 zsh로 작동합니다.

git fetch; [ $(git rev-parse HEAD) = $(git rev-parse @{u}) ] \
    && echo "Up to date" || echo "Not up to date"
git ls-remote | cut -f1 | git cat-file --batch-check >&-

저장소에 없는 원격에서 참조되는 모든 항목이 나열됩니다.이미 수행한 작업(예: 이전 커밋으로 재설정)에 대한 원격 참조 변경사항을 포착하려면 다음 작업이 조금 더 필요합니다.

git pack-refs --all
mine=`mktemp`
sed '/^#/d;/^^/{G;s/.\(.*\)\n.* \(.*\)/\1 \2^{}/;};h' .git/packed-refs | sort -k2 >$mine
for r in `git remote`; do 
    echo Checking $r ...
    git ls-remote $r | sort -k2 | diff -b - $mine | grep ^\<
done

작업을 crontab으로 추가하려면 다음과 같이 하십시오.

#!/bin/bash
dir="/path/to/root"
lock=/tmp/update.lock
msglog="/var/log/update.log"

log()
{
        echo "$(date) ${1:-missing}" >> $msglog
}

if [ -f $lock ]; then
        log "Already run, exiting..."
else
        > $lock
        git -C ~/$dir remote update &> /dev/null
        checkgit=`git -C ~/$dir status`
        if [[ ! "$checkgit" =~ "Your branch is up-to-date" ]]; then
                log "-------------- Update ---------------"
                git -C ~/$dir pull &>> $msglog
                log "-------------------------------------"
        fi
        rm $lock

fi
exit 0

Neils의 답변이 매우 도움이 되었기 때문에 종속성이 없는 Python 번역이 여기 있습니다.

import os
import logging
import subprocess

def check_for_updates(directory:str) -> None:
    """Check git repo state in respect to remote"""
    git_cmd = lambda cmd: subprocess.run(
        ["git"] + cmd,
        cwd=directory,
        stdout=subprocess.PIPE,
        check=True,
        universal_newlines=True).stdout.rstrip("\n")

    origin = git_cmd(["config", "--get", "remote.origin.url"])
    logging.debug("Git repo origin: %r", origin)
    for line in git_cmd(["fetch"]):
        logging.debug(line)
    local_sha = git_cmd(["rev-parse", "@"])
    remote_sha = git_cmd(["rev-parse", "@{u}"])
    base_sha = git_cmd(["merge-base", "@", "@{u}"])
    if local_sha == remote_sha:
        logging.info("Repo is up to date")
    elif local_sha == base_sha:
        logging.info("You need to pull")
    elif remote_sha == base_sha:
        logging.info("You need to push")
    else:
        logging.info("Diverged")

check_for_updates(os.path.dirname(__file__))

hth

git ls-remote origin -h refs/heads/master

brool이 주는 것은 원격에서 무언가가 바뀌었는지 확인하는 가장 가벼운 방법입니다.

로컬 헤드부터 시작:

$ git log -1 --oneline @
9e1ff307c779 (HEAD -> master, tag: v5.15-rc4, origin/master, origin/HEAD) Linux 5.15-rc4

저는 그 태그에서 제가 뽑힌 출처가 최신임을 알 수 있습니다. git status그렇다고도 합니다.그러나 이는 로컬 최신 버전일 뿐이며, 가져오기 후에 (빠른 전달) 병합됩니다.

원격 HEAD가 어디로 갔는지, 마스터했는지, 그리고 몇 가지 새로운 태그를 확인하려면:

$ git ls-remote origin HEAD master --tags 'v5.1[56]-rc[345]*'

84b3e42564accd94c2680e3ba42717c32c8b5fc4        HEAD
84b3e42564accd94c2680e3ba42717c32c8b5fc4        refs/heads/master
71a6dc2a869beafceef1ce46a9ebefd52288f1d7        refs/tags/v5.15-rc3
5816b3e6577eaa676ceb00a848f0fd65fe2adc29        refs/tags/v5.15-rc3^{}
f3cee05630e772378957a74a209aad059714cbd2        refs/tags/v5.15-rc4
9e1ff307c779ce1f0f810c7ecce3d95bbae40896        refs/tags/v5.15-rc4^{}

HEAD는 여전히 동일한 분기에 있지만 더 이상 동일한 커밋이 아닙니다. 지역의 당해로컬.@v5.15-rc4 태그를 사용하여 체류를 커밋합니다.이것은 kernel.org git의 요약 시트 위에 있는 것과 거의 같은 정보입니다.

Branch: master <commit message> <author> age: 2 hours

그 ㅠㅠㅠㅠls-remote수집하는 정보가 적지만 역시 나만 알고 있습니다.9e1ff...v5.15-rc4 파일입니다.

참조(HEAD, 마스터) 또는 태그의 이름을 지정하는 대신 모든 repo에서 헤드 또는 분기 목록을 가져올 수 있습니다.

$ git ls-remote --heads git://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git 

af06aff2a0007976513134dfe993d55992dd866a        refs/heads/akpm
20bcee8e95f783c11a7bea1b6a40c70a37873e0a        refs/heads/akpm-base
a25006a77348ba06c7bc96520d331cd9dd370715        refs/heads/master
4d5a088c93cea1c821d02a2217c592391d9682e2        refs/heads/pending-fixes
4de593fb965fc2bd11a0b767e0c65ff43540a6e4        refs/heads/stable

여기서 URL이 "origin"을 대체합니다.


원격 리포지토리가 변경되었는지 확인하고 풀링해야 하는지 확인하려면 어떻게 해야 합니까?

그렇게 물으면 그냥 당기세요.

원격 리포지토리가 최종적으로 어떤 작업을 수행했는지 확인하고 풀링하려면 어떻게 해야 합니까?

그런 다음 가져와서 확인하고 병합합니다.


단일 git 명령 사용:

$ git rev-list -1  master
9e1ff307c779ce1f0f810c7ecce3d95bbae40896
$ git rev-list -1  @
9e1ff307c779ce1f0f810c7ecce3d95bbae40896

이것 자체로는 많은 것을 말하지 않지만, 내가 아무것도 저지르지 않았다는 것을 안다고 가정하면 다음과 같습니다.

$ git ls-remote origin HEAD master
60a9483534ed0d99090a2ee1d4bb0b8179195f51        HEAD
60a9483534ed0d99090a2ee1d4bb0b8179195f51        refs/heads/master

리모컨이 바뀌었다고 알려줄 것입니다.정말 마지막 편집 이후로.kernel.org 는 말합니다.Age: 46 min.마스터에 대한 이 마지막 커밋에 대해.

나 뒤에git fetch:

$ git rev-list -1 master     
9e1ff307c779ce1f0f810c7ecce3d95bbae40896

$ git rev-list -1 FETCH_HEAD
60a9483534ed0d99090a2ee1d4bb0b8179195f51

$ git log --oneline ..FETCH_HEAD        
60a9483534ed (origin/master, origin/HEAD) Merge tag 'warning-fixes-20211005' of git://git.kernel.org/pub/scm/linux/kernel/git/dhowells/linux-fs
f6274b06e326 Merge tag 'linux-kselftest-fixes-5.15-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/shuah/linux-kselftest
ef31499a87cf fscache: Remove an unused static variable
d9e3f82279bf fscache: Fix some kerneldoc warnings shown up by W=1
bc868036569e 9p: Fix a bunch of kerneldoc warnings shown up by W=1
dcb442b13364 afs: Fix kerneldoc warning shown up by W=1
c0b27c486970 nfs: Fix kerneldoc warning shown up by W=1
84b3e42564ac Merge tag 'media/v5.15-3' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media
b60be028fc1a Merge tag 'ovl-fixes-5.15-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/mszeredi/vfs
df5c18838ea8 Merge tag 'mips-fixes_5.15_1' of git://git.kernel.org/pub/scm/linux/kernel/git/mips/linux
206704a1fe0b media: atomisp: restore missing 'return' statement
740da9d7ca4e MIPS: Revert "add support for buggy MT7621S core detection"
1dc1eed46f9f ovl: fix IOCB_DIRECT if underlying fs doesn't support direct IO
2f9602870886 selftests: drivers/dma-buf: Fix implicit declaration warns
a295aef603e1 ovl: fix missing negative dentry check in ovl_rename()

이제 모든 정보를 로컬에서 얻었지만 (아직) 병합하지는 않았습니다.저는 또한 모든 물건들을 다운로드 받았습니다. git show HASH또는git diff HASH일하다.

이 경우 병합은 거의 불가능합니다. 마지막 커밋으로 빠르게 전달되고 충돌은 말할 것도 없고 추가적인(실제) 병합은 없습니다.--ff-only를 통해 확인할 수 있습니다.

$ git merge --ff-only FETCH_HEAD
Updating 9e1ff307c779..60a9483534ed
Fast-forward
...
... 

그럼 언제 당길지 어떻게 알 수 있죠? 두 : 이두해가변경즉시다같음변다이경니됩과는되시:▁as다니변.Updating 9e1ff307c779..60a9483534ed Fast-forward이들은 동일할 수 없으며, 이는 "업데이트할 내용이 없음"

최신 reflog 커밋에서도 다음과 같이 말합니다.

$ git log -10 --oneline -g
60a9483534ed (HEAD -> master, origin/master, origin/HEAD) HEAD@{0}: merge 60a9483534ed0d99090a2ee1d4bb0b8179195f51: Fast-forward
9e1ff307c779 (tag: v5.15-rc4) HEAD@{1}: pull: Fast-forward

, 가 등장하는 것이 가 될 가 될 입니다; 이을보면태나것이, ▁the▁to▁in▁looking▁appearing▁back다▁is▁that▁and▁leads;니▁a▁tag집▁this,▁case▁maybe▁target이▁new어▁the이▁at▁also▁this그것로으은다다것▁best▁trigger음시,.git ls-remote origin --tags PATTERN.


설마...그리고 나에게 말하지 마.git remote show다른 방법입니다.

표시 원격에 대한 일부 정보를 제공합니다.

-n 옵션을 사용하면 원격 헤드가 gits-remote로 먼저 쿼리되지 않고 캐시된 정보가 대신 사용됩니다.

자동화하기git pull원하는 분기에서:
다음과 같은 용도:./pull.sh "origin/main"

pull.sh

#!/bin/bash

UPSTREAM=${1:-'@{u}'}
DIFFCOMM=$(git fetch origin --quiet; git rev-list HEAD..."$UPSTREAM" --count)
if [ "$DIFFCOMM" -gt 0 ]; then
  echo "Pulling $UPSTREAM";
  git pull;
else
  echo "Up-to-date";
fi

저는 Stephen Haberman의 대답에 기반한 스크립트 버전을 사용합니다.

if [ -n "$1" ]; then
    gitbin="git -C $1"
else
    gitbin="git"
fi

# Fetches from all the remotes, although --all can be replaced with origin
$gitbin fetch --all
if [ $($gitbin rev-parse HEAD) != $($gitbin rev-parse @{u}) ]; then
    $gitbin rebase @{u} --preserve-merges
fi

를 이스트호를가고출다정니합다한크립▁is▁called▁this라고 가정합니다.git-fetch-and-rebase인 인수 " 적인수사용호수있다습니출할여하선를택다니▁an▁can▁it▁with▁be있▁invoked▁argument습▁optional"로 호출할 수 있습니다.directory name작업을 수행할 로컬 Git 저장소의.스크립트가 인수 없이 호출되면 현재 디렉터리가 Git 저장소의 일부로 간주됩니다.

예:

# Operates on /abc/def/my-git-repo-dir
git-fetch-and-rebase /abc/def/my-git-repo-dir

# Operates on the Git repository which the current working directory is part of
git-fetch-and-rebase

이곳에서도 이용할 수 있습니다.

많은 답변과 여러 게시물을 읽고, 다양한 순열을 시도하며 반나절을 보낸 후, 이것이 제가 생각해 낸 것입니다.

Windows에 있는 경우 Windows용 Git에서 제공하는 Git Bash(설치 또는 휴대용)를 사용하여 Windows에서 이 스크립트를 실행할 수 있습니다.

이 스크립트에는 인수가 필요합니다.

로컬 경로(예: /d/source/project1)Git URL(예: https://username@bitbucket.org /https/project1.git)비밀번호
명령행에 일반 텍스트로 암호를 입력하면 안 되는 경우그런 다음 스크립트를 수정하여 GITPASS가 비어 있는지 확인합니다.대체하고 Git가 암호를 입력하도록 합니다.

대본은.

- Find the current branch
- Get the SHA1 of the remote on that branch
- Get the SHA1 of the local on that branch
- Compare them.

스크립트에 인쇄된 대로 변경 사항이 있으면 가져오거나 끌어오기를 계속할 수 있습니다.대본이 효율적이지 않을 수도 있지만, 저를 위해 일을 해줍니다.

업데이트 - 2015-10-30: 콘솔에 대한 암호로 URL을 인쇄하지 못하도록 stderr to dev null.

#!/bin/bash

# Shell script to check if a Git pull is required.

LOCALPATH=$1
GITURL=$2
GITPASS=$3

cd $LOCALPATH
BRANCH="$(git rev-parse --abbrev-ref HEAD)"

echo
echo git url = $GITURL
echo branch = $BRANCH

# Bash replace - replace @ with :password@ in the GIT URL
GITURL2="${GITURL/@/:$GITPASS@}"
FOO="$(git ls-remote $GITURL2 -h $BRANCH 2> /dev/null)"
if [ "$?" != "0" ]; then
  echo cannot get remote status
  exit 2
fi
FOO_ARRAY=($FOO)
BAR=${FOO_ARRAY[0]}
echo [$BAR]

LOCALBAR="$(git rev-parse HEAD)"
echo [$LOCALBAR]
echo

if [ "$BAR" == "$LOCALBAR" ]; then
  #read -t10 -n1 -r -p 'Press any key in the next ten seconds...' key
  echo No changes
  exit 0
else
  #read -t10 -n1 -r -p 'Press any key in the next ten seconds...' key
  #echo pressed $key
  echo There are changes between local and remote repositories.
  exit 1
fi

단순 정규식 사용:

str=$(git status) 
if [[ $str =~ .*Your\ branch\ is\ behind.*by.*commits,\ and\ can\ be\ fast-forwarded ]]; then
    echo `date "+%Y-%m-%d %H:%M:%S"` "Needs pull"
else
    echo "Code is up to date"
fi

이 문제를 찾는 Windows 사용자를 위해 일부 답변을 파워셸 스크립트로 수정했습니다.따라 하고, , 장▁a▁to에 합니다..ps1요청 시 또는 예약된 경우 파일 및 실행할 수 있습니다.

cd C:\<path to repo>
git remote update                           #update remote
$msg = git remote show origin               #capture status
$update = $msg -like '*local out of date*'
if($update.length -gt 0){                   #if local needs update
    Write-Host ('needs update')
    git pull
    git reset --hard origin/master
    Write-Host ('local updated')
} else {
    Write-Host ('no update needed')
}

이제 그런 일을 하는 Phing 스크립트도 찾을 수 있습니다.

운영 환경을 자동으로 업데이트할 수 있는 솔루션이 필요했는데, 공유하고 있는 이 스크립트 덕분에 매우 기쁩니다.

스크립트는 XML로 작성되었으며 Phing이 필요합니다.

언급URL : https://stackoverflow.com/questions/3258243/check-if-pull-needed-in-git