繁体   English   中英

如何从远程git存储库一次提取一个提交?

[英]How to pull one commit at a time from a remote git repository?

我正在尝试建立一个git存储库的darcs镜像。 我有一些工作正常,但有一个重大问题:如果我将一大堆提交推送到git repo,那些提交将合并到一个darcs补丁集中。 我真的想确保每个git commit都设置为单个darcs补丁集。 我打赌这可以通过做某种git fetch然后询问远程分支的本地副本来实现,但是我的git fu不能胜任这项工作。

这是我现在使用的(ksh)代码,或多或少:

git pull -v # pulls all the commits from remote --- bad!

# gets information about only the last commit pulled -- bad!
author="$(git log HEAD^..HEAD --pretty=format:"%an <%ae>")"
logfile=$(mktemp)
git log HEAD^..HEAD --pretty=format:"%s%n%b%n" > $logfile

# add all new files to darcs and record a patchset. this part is OK
darcs add -q --umask=0002 -r .
darcs record -a -A "$author" --logfile="$logfile"
darcs push -a
rm -f $logfile

我的想法是

  1. 尝试使用git fetch获取远程分支的本地副本(不确定需要什么参数)
  2. 以某种方式询问本地副本以获取自上次镜像操作以来每次提交的哈希值(我不知道如何执行此操作)
  3. 循环遍历所有哈希,拉动该提交并记录相关的补丁集(我很确定如果我抓住哈希,我知道如何做到这一点)

我欢迎任何帮助充实上面的场景或建议我应该尝试的其他事情。

想法?

你有没有尝试过一些现有的解决方案,用于在版本控制系统之间移动变更集,例如Tailor ,它说它包括对git和darcs的支持? (该页面上也有类似系统的建议。)

否则,如果你想使用你建议的方法,你可以在HEADorigin/master之后的每次提交中使用git checkout来检查在“分离的HEAD”模式下提交。 例如,要修改你给出的例子(在bourne shell中,我很害怕,因为我不使用ksh):

# Update all remote-tracking branches from origin
git fetch origin

for c in `git log --pretty=format:"%h" HEAD..origin/master`
do
     git checkout $c
     author=$(git log -1 --pretty=format:"%an <%ae>")
     logfile=$(mktemp)
     git log -1 --pretty=format:"%s%n%n%b%n" > $logfile

     darcs add -q --umask=0002 -r .
     darcs record -a -A "$author" --logfile="$logfile"
     darcs push -a
     rm -f $logfile         
done

# Now go back to master, and merge to keep your master branch up to date:
git checkout master
git merge origin/master

请注意,这将使git中的历史线性化,这不是我想要的,就个人而言。 :)我认为最好使用现有的工具,但上述方法可以使用。

你可以这样做:

#!/bin/bash
git fetch
count=$(git log --pretty=oneline | wc -l)
git merge origin/master
git reset --hard HEAD~$((count-1))

我为这个脚本创建了一个存储库并试了一下。 以下是合并前后:

在此输入图像描述

在此输入图像描述

现在我没有远程存储库所以我伪造了git fetch和远程分支与本地(名为kalle),但你明白了。 只需执行完整合并,然后备份HEAD指针,直到从origin / master获得第一次提交。

git remote update # fetch all remotes I like it better than just fetch

git log origin/master # can be any remote/branch

git cherry-pick origin/master # example remote/branch you can also specify a sha1

cherry-pick将默认选择顶部补丁。

对于第三部分,我认为你必须编写一个脚本来为你做。 还有其他方法可以获取日志的哈希和许多选项。 实际上可能有一个用于樱桃选择的钩子或者可能只是发布提交...来运行darcs代码。 看看git hooks。

实际上在那个注释中,在rebase中应用的每个补丁都可以调用git commit hook,这样你就可以编写它然后执行git pull --rebase并在每次应用时修复该代码...

使用此命令从分支中检索哈希值:

git log --pretty=format:"%h" HEAD..origin/master

然后使用git cherry-pick -n <hash>来应用每一个。

@xenoterracide引用的另一种选择是使用githooks。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM