如何更新我的fork以获得与github上的原始存储库相同的分支和标记?

时间:2013-04-03 05:45:40

标签: git github

当您在github上分叉存储库时,您的分叉存储库包含所有分支和标记。

随着时间的推移,这些分支和标签会过时。

如何使用fork轻松确保您的fork具有所有分支和标签而无需重新拼接?

即。一个git magicpull --rebase upstream / * myremote / *

将获取上游的所有分支和标记,并确保myremote中存在相同的分支和标记。

4 个答案:

答案 0 :(得分:40)

这假设您的“上游”遥控器名为“origin”,并且您的用户名下有自定义分叉(即“maxandersen”)

当你的克隆运行以下单行时(刷新Track all remote git branches as local branches

remote=origin ; for brname in `git branch -r | grep origin | grep -v master | grep -v HEAD | sed -e 's/.*\///g'`; do git branch --track $brname  $remote/$brname ; done

这将为名为“origin”的远程中找到的所有分支设置跟踪分支。 如果您已经使用此分支机构进行结账,除非确保跟踪已到位,否则不会更改任何内容。

(可选)现在确保所有分支都是uptodate(如果您已经签出分支,则非常有用):

git pull --rebase --all

现在所有分支都设置为跟踪和uptodate将分支标记推送到您的远程(用您的远程名称替换'maxandersen'):

git push --all maxandersen
git push --tags maxandersen

此后你的叉子同步。

以下脚本完成所有这些操作,包括要求确认:

## Checkout all branches from remote as tracking branches. Based on    https://stackoverflow.com/questions/379081/track-all-remote-git-branches-as-local-branches/6300386#6300386

UPSTREAM=$1
MYREPO=$2

usage() {
   echo "Usage:"
   echo "$0 <upstream-remote> <target-remote>"
   echo ""
   echo "Example which ensures remote named 'maxandersen' have all the same branches and tags as 'origin'"
   echo "$0 origin maxandersen"
   exit 1
}

if [ -z "$UPSTREAM" ]
then
 echo Missing upstream remote name.
 usage
fi

if [ -z "$MYREPO" ]
then
 echo Missing target remote name. 
 usage
fi

read -p "1. This will setup '$MYREPO' to track all branches in '$UPSTREAM' - Are you sure ?" -n 1 -r

if [[ $REPLY =~ ^[Yy]$ ]]
then
 for brname in `git branch -r | grep "$UPSTREAM" | grep -v master | grep -v HEAD | sed -e 's/.*\///g'`; do git branch --track $brname  $UPSTREAM/$brname ; done
fi

read -p "2. This will push all local branches and tags into '$MYREPO' - Are you sure ?" -n 1 -r

if [[ $REPLY =~ ^[Yy]$ ]]
then
 git push --all $MYREPO
 git push --tags $MYREPO
fi

将其保存为'updateallbranchestags.sh'并使用以下命令执行:

sh updateallbranches.sh origin maxandersen

来自'origin'的所有分支/标签都将在远程命名的'maxandersen'中提供

答案 1 :(得分:18)

你仍然需要一个本地克隆,它将:

upstream and fork

  • git push --all origin(起源是你的分叉):假设:
    • 您拥有跟踪所有上游分支的所有本地分支机构(请参阅上一步) 否则,默认情况下只会推送一个本地分支,因为克隆只会创建一个本地分支(默认值)
    • 你没有在这些分支上推销自己的提交。

答案 2 :(得分:2)

您可以直接推送遥控器。 显然这没有考虑到fork的变化,但它仍然回答了这个问题。如果更改有限,那么您可以使用本地分支轻松合并/重组它们。

git push -f origin refs/remotes/upstream/*:refs/heads/*

答案 3 :(得分:-2)

这里https://asciinema.org/a/lv9v5mh1GGQJsfKIzUSlzsg7i是一个毫不费力的实际演示,我如何同步从上游同步克隆的回购协议的masterrelease-18.09分支。