多年前,我在Github上创建了一个SourceForge项目的公共存储库。那时候,项目只支持CVS,所以我使用git cvs定期将我的存储库与原始存储库同步。
很长一段时间没有对CVS存储库进行任何提交,现在我发现他们也转移到了git(虽然在Sourceforge上,而不是Github)。
我现在的问题是:如何将SF git存储库中的更改合并到我的存储库中?
到目前为止我尝试了什么:
git fetch upstream
git checkout master
git merge upstream/master
最后一步没有错误,但git status
告诉我主人和他起源/主人有分歧。现在执行git pull
会导致很多冲突(" CONFLICT(添加/添加)")。
答案 0 :(得分:2)
如果您只是简单地将修改重新定位到从cvs导入的分支上,这可能非常简单。我的第一次尝试是通过提交消息中的可识别文本匹配提交,然后尝试匹配patch-id
设置:找到您工作的当前基本提交:
currentbase=$(git merge-base master master@{u})
git show -s $currentbase
现在在upstream/master
中找到相应的提交:
git checkout upstream/master
git show -s :/"some regex for unique-looking text in the $currentbase message"
# and if that's right
newbase=`git rev-parse !git:$` # !git:$ is last arg to previous git command
如果这不起作用,请尝试查找应用相同补丁的提交:
patchids=`mktemp`
git rev-list upstream/master \
| while read; do
git diff-tree -p $REPLY | git patch-id
done >> $patchids
# hunt up a commit that makes the same changes as $currentbase
set -- `git diff-tree -p $currentbase | git patch-id`
grep $2 $patchids
# and if it finds one
set -- $(!grep) # !grep is whole of last grep command
newbase=$2
然而,当你找到合适的
时,你会发现它git rebase --onto $newbase master@{u} master
git branch -u upstream/master
从那里开始,你可以像往常一样,普通git rebase
默认为当前的上游。
答案 1 :(得分:0)
问题是上游/主服务器和主服务器的历史完全不同(每个提交都有不同的SHA1)
您需要查看上游/主数据库的历史记录,并确定Sourceforge Git存储库中与您自己的master
历史记录相比较新的提交内容。
然后,你可以:
master
分支git cherry-pick
从upstream/master
到新分支的所有提交(从master
开始)master
。