我分叉了一个项目,进行了更改,并创建了一个被接受的拉取请求。新的提交后来被添加到存储库中。我怎样才能把这些承诺交给我?


当前回答

如果您设置了上游。用gitremote-v检查一下,这就足够了。

git fetch upstream
git checkout master
git merge --no-edit upstream/master
git push

其他回答

保持分叉存储库始终保持永久更新有两个主要方面。

1.从fork master创建分支并在那里进行更改。

因此,当您的PullRequest被接受时,您可以安全地删除分支,因为当您使用上游更新它时,您贡献的代码将保存在分叉存储库的主库中。这样,您的主机将始终处于干净状态,以便创建新的分支以进行另一个更改。

2.为fork master创建一个计划作业,以便自动进行更新。

这可以用cron完成。下面是一个示例代码,如果您在linux中执行此操作。

$ crontab -e

将此代码放在crontab文件中,以每小时执行一次作业。

0 * * * * sh ~/cron.sh

然后创建cron.sh脚本文件,并与ssh代理和/或预期的git交互,如下所示

#!/bin/sh
WORKDIR=/path/to/your/dir   
REPOSITORY=<name of your repo>
MASTER="git@github.com:<username>/$REPOSITORY.git"   
UPSTREAM=git@github.com:<upstream>/<name of the repo>.git  

cd $WORKDIR && rm -rf $REPOSITORY
eval `ssh-agent` && expect ~/.ssh/agent && ssh-add -l
git clone $MASTER && cd $REPOSITORY && git checkout master
git remote add upstream $UPSTREAM && git fetch --prune upstream
if [ `git rev-list HEAD...upstream/master --count` -eq 0 ]
then
    echo "all the same, do nothing"
else
    echo "update exist, do rebase!"
    git reset --hard upstream/master
    git push origin master --force
fi
cd $WORKDIR && rm -rf $REPOSITORY
eval `ssh-agent -k`

检查分叉的存储库。它将不时显示此通知:

此分支与<upstream>:master相等。

$ git remote add upstream https://github.com/....

$ git pull upstream main

$ git push

我用这一行更新我的分叉回购:

git pull https://github.com/forkuser/forkedrepo.git branch

如果您不想在项目中添加另一个远程端点,请使用此选项,如其他解决方案所示。

自2013年11月以来,GitHub发布了一个非官方的功能请求,要求他们添加一个非常简单直观的方法来保持本地分叉与上游同步:

https://github.com/isaacs/github/issues/121

注意:由于功能请求是非官方的,因此建议联系support@github.com添加对要实现的类似功能的支持。上述非官方功能请求可作为对正在实施的功能感兴趣的证据。

在分叉存储库的本地克隆中,可以将原始GitHub存储库添加为“远程”。(“Remotes”就像是存储库URL的昵称,例如,origin就是其中之一。)然后,您可以从上游存储库中获取所有分支,并重新设置工作基础,继续使用上游版本。就命令而言,可能如下所示:

# Add the remote, call it "upstream":

git remote add upstream https://github.com/whoever/whatever.git

# Fetch all the branches of that remote into remote-tracking branches

git fetch upstream

# Make sure that you're on your master branch:

git checkout master

# Rewrite your master branch so that any commits of yours that
# aren't already in upstream/master are replayed on top of that
# other branch:

git rebase upstream/master

如果您不想重写主分支的历史记录(例如,因为其他人可能已经克隆了它),那么应该用gitmergeupstream/master替换最后一个命令。然而,为了做出尽可能干净的进一步拉取请求,可能最好重新设置基址。


如果您已经将分支重新基于upstream/master,则可能需要强制推送,以便将其推送到GitHub上自己的分叉存储库。你可以这样做:

git push -f origin master

您只需要在重新启动后第一次使用-f即可。