마스터, 스테이징 및 프로덕션과 같은 원격 브랜치가 3 개 이상있는 경우가 많습니다. 그 원격 지점을 추적하는 3 개의 로컬 지점이 있습니다.
내 모든 지사를 업데이트하는 것은 지루합니다.
git fetch --all
git rebase origin/master
git checkout staging
git rebase origin/staging
git checkout production
git rebase origin/production
“git pull-all”을 할 수 있기를 원하지만 작동시키지 못했습니다. “fetch –all”을 수행 한 다음 현재 작업 분기를 업데이트 (빨리 감기 또는 병합)하지만 다른 로컬 분기는 업데이트하지 않는 것 같습니다.
여전히 각 로컬 지점으로 수동 전환하고 업데이트하고 있습니다.
답변
설명하는 동작 pull --all
은 예상 한대로 정확하지만 반드시 유용한 것은 아닙니다. 이 옵션은 git fetch로 전달됩니다. 그러면 git fetch가 필요한 것 대신에 모든 리모컨에서 모든 참조를 가져옵니다. pull
그런 다음 적절한 단일 분기를 병합합니다 (또는 경우에 따라 리베이스).
다른 지점을 확인하려면 해당 지점을 확인해야합니다. 그리고 그렇습니다. 병합 (및 rebasing)에는 절대적 으로 작업 트리가 필요하므로 다른 분기를 확인하지 않고는 작업 트리를 수행 할 수 없습니다. 원하는 경우 설명 된 단계를 스크립트 / 별명으로 마무리 할 수 있습니다. 명령 &&
중 하나가 실패 하더라도 쟁기질을 시도하지 않도록 명령을 결합하는 것이 좋습니다 .
답변
허브 의 sync
부속 명령 을 사용합니다 이를 자동화합니다. 내가 가진 alias git=hub
내에서 .bash_profile
명령 I 유형이 있으므로 :
git sync
업스트림 분기와 일치하는 모든 로컬 분기가 업데이트됩니다. 매뉴얼 페이지에서 :
- 지역 지점이 구식 인 경우 빨리 감습니다.
- 지역 지점에 압축되지 않은 작업이 포함되어 있으면 경고하십시오.
- 분기가 병합 된 것으로 보이고 업스트림 분기가 삭제 된 경우 삭제하십시오.
또한 현재 브랜치에서 커밋되지 않은 변경 사항을 숨김 / 스 태싱 해제 처리합니다.
나는 git-up 이라는 비슷한 도구를 사용 했지만 더 이상 유지 관리 git sync
되지 않으며 거의 똑같은 일을합니다.
답변
나는이 질문이 거의 3 세라는 것을 알고 있지만, 나 자신에게도 같은 질문을하고 준비된 해결책을 찾지 못했습니다. 그래서 나는 사용자 정의 git 명령 쉘 스크립트를 스스로 만들었습니다.
여기가 간다 git-ffwd-update
스크립트는 다음을 수행 …
git remote update
늦은 개정을 가져 오기 위해 a 를 발행합니다.- 그런 다음
git remote show
원격 분기를 추적하는 로컬 분기 목록을 가져 오는 데 사용 합니다 (예 :와 함께 사용할 수있는 분기git pull
). - 그런 다음
git rev-list --count <REMOTE_BRANCH>..<LOCAL_BRANCH>
로컬 지점이 원격 뒤에있는 커밋 수를 확인합니다 (그리고 그 반대도 마찬가지) - 로컬 분기 1 이상의 커밋 앞서의 경우, 그것은 할 수 없습니다 빠른 전달과 요구는 합병 또는 손으로 업데이트 할 수
- 로컬 브랜치가 0 커밋 앞서 있고 1 개 이상의 커밋이 뒤에 있다면
git branch -f <LOCAL_BRANCH> -t <REMOTE_BRANCH>
스크립트는 다음과 같이 호출 될 수 있습니다.
$ git ffwd-update
Fetching origin
branch bigcouch was 10 commit(s) behind of origin/bigcouch. resetting local branch to remote
branch develop was 3 commit(s) behind of origin/develop. resetting local branch to remote
branch master is 6 commit(s) behind and 1 commit(s) ahead of origin/master. could not be fast-forwarded
전체 스크립트는로 저장해야하며에 있어야 git-ffwd-update
합니다 PATH
.
#!/bin/bash
main() {
REMOTES="$@";
if [ -z "$REMOTES" ]; then
REMOTES=$(git remote);
fi
REMOTES=$(echo "$REMOTES" | xargs -n1 echo)
CLB=$(git rev-parse --abbrev-ref HEAD);
echo "$REMOTES" | while read REMOTE; do
git remote update $REMOTE
git remote show $REMOTE -n \
| awk '/merges with remote/{print $5" "$1}' \
| while read RB LB; do
ARB="refs/remotes/$REMOTE/$RB";
ALB="refs/heads/$LB";
NBEHIND=$(( $(git rev-list --count $ALB..$ARB 2>/dev/null) +0));
NAHEAD=$(( $(git rev-list --count $ARB..$ALB 2>/dev/null) +0));
if [ "$NBEHIND" -gt 0 ]; then
if [ "$NAHEAD" -gt 0 ]; then
echo " branch $LB is $NBEHIND commit(s) behind and $NAHEAD commit(s) ahead of $REMOTE/$RB. could not be fast-forwarded";
elif [ "$LB" = "$CLB" ]; then
echo " branch $LB was $NBEHIND commit(s) behind of $REMOTE/$RB. fast-forward merge";
git merge -q $ARB;
else
echo " branch $LB was $NBEHIND commit(s) behind of $REMOTE/$RB. resetting local branch to remote";
git branch -f $LB -t $ARB >/dev/null;
fi
fi
done
done
}
main $@
답변
자동화하기가 어렵지 않습니다.
#!/bin/sh
# Usage: fetchall.sh branch ...
set -x
git fetch --all
for branch in "$@"; do
git checkout "$branch" || exit 1
git rebase "origin/$branch" || exit 1
done
답변
옵션이 있기를 원하기 때문에 이것은 여전히 자동적이지 않습니다-그리고 이것이 빨리 감기 업데이트에서만 발생할 수 있는지 확인해야합니다 (수동으로 풀을 수행하는 것이 훨씬 안전합니다 !!), 그러나 당신이 할 수있는주의 사항 :
git fetch origin
git update-ref refs/heads/other-branch origin/other-branch
체크 아웃하지 않고 로컬 지점의 위치를 업데이트합니다.
참고 : 현재 지점 위치를 잃고 원점 지점으로 이동하면 병합해야 할 경우 데이터가 손실됩니다!
답변
여기에는 많은 답변이 있지만 git-fetch
로컬 참조를 직접 업데이트 하는 데 사용 하는 것은 없습니다 . 이것은 분기를 확인하는 것보다 훨씬 간단하고보다 안전합니다 git-update-ref
.
여기서는 git-fetch
비 현재 분기 및 현재 분기를 업데이트 하는 데 사용 합니다 git pull --ff-only
. 그것:
- 지점을 확인하지 않아도됩니다
- 빨리 감기 할 수있는 경우에만 지점을 업데이트합니다.
- 빨리 감을 수 없을 때보고합니다
그리고 여기 있습니다 :
#!/bin/bash
currentbranchref="$(git symbolic-ref HEAD 2>&-)"
git branch -r | grep -v ' -> ' | while read remotebranch
do
# Split <remote>/<branch> into remote and branchref parts
remote="${remotebranch%%/*}"
branchref="refs/heads/${remotebranch#*/}"
if [ "$branchref" == "$currentbranchref" ]
then
echo "Updating current branch $branchref from $remote..."
git pull --ff-only
else
echo "Updating non-current ref $branchref from $remote..."
git fetch "$remote" "$branchref:$branchref"
fi
done
맨 페이지에서 git-fetch
:
<refspec>
The format of a <refspec> parameter is an optional plus +, followed by the source ref <src>,
followed by a colon :, followed by the destination ref <dst>.
The remote ref that matches <src> is fetched, and if <dst> is not empty string, the local ref
that matches it is fast-forwarded using <src>. If the optional plus + is used, the local ref is
updated even if it does not result in a fast-forward update.
git fetch <remote> <ref>:<ref>
(없이 +
) 를 지정 하면 빨리 감기 할 수있을 때만 로컬 참조를 업데이트하는 인출을 얻습니다.
참고 : 로컬 및 원격 브랜치의 이름이 동일하고 모든 브랜치를 추적하려는 것으로 가정하면 실제로는 로컬 브랜치 및 추적하도록 설정 한 로컬 브랜치에 대한 정보를 사용해야합니다.
답변
이 문제는 (아직) 스크립팅 없이는 아직 해결되지 않았습니다. Junio C Hamano의 git 메일 링리스트에있는 이 게시물 을 참조 하여 상황을 설명하고 간단한 솔루션을 요청하십시오.
주요 이유는 다음이 필요하지 않다는 것입니다.
고대 버전 (즉, v1.5.0 이상)이 아닌 git을 사용하면 더 이상 원격을 완전히 추적하는 로컬 “dev”를 가질 이유가 없습니다. 보고 만보고 싶다면 ”
git checkout origin/dev
” 를 사용하여 분리 된 HEAD에서 직접 원격 추적 분기를 확인할 수 있습니다 .즉, 사용자가 편리하게 할 수있는 유일한 경우는 로컬 변경이 있거나 일부를 계획 할 때 원격 지점을 “추적”하는 로컬 지점을 처리하는 것입니다.
“dev”제거를 추적하도록 표시된 “dev”에 대한 로컬 변경 사항이 있고 “dev”와 다른 분기에있는 경우 ”
git fetch
“가 원격 추적 “dev”를 업데이트 한 후에는 아무것도 수행하지 않아야 합니다. . 어쨌든 빨리 감지 않을 것입니다
해결책에 대한 요구는 요청 된 원래 포스터와 같이 빨리 감기를 통해 최신 분기를 유지하기보다는 현재 원격 추적 분기를 따르는 로컬 분기 를 제거 하는 옵션 또는 외부 스크립트가 필요했습니다.
git branch --prune --remote=<upstream>
지역 분기를 반복 하는 ” “는 어떻 습니까?(1) 현재 지점이 아닙니다. 및
(2)에서 찍은 일부 지점을 추적하기 위해 표시되는 <상류>; 및
(3) 그 자체에 어떤 커밋이없는;그런 다음 그 지점을 제거? ”
git remote --prune-local-forks <upstream>
“도 괜찮습니다. 어떤 명령이 기능을 그렇게 많이 구현하는지는 중요하지 않습니다.
참고 : git 2.10부터는 그러한 해결책이 없습니다. 참고 그git remote prune
부속 명령 및git fetch --prune
더 이상하지 트랙 분기를 원격 추적하는 것이 지역 지점 (있는 원격 추적 지점 상류 지점입니다) 제거에 대한 원격에 존재하는 지점 원격 추적 브랜치를 제거하는 방법에 대한 없습니다.