[英]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
我的想法是
git fetch
获取远程分支的本地副本(不确定需要什么参数) 我欢迎任何帮助充实上面的场景或建议我应该尝试的其他事情。
想法?
你有没有尝试过一些现有的解决方案,用于在版本控制系统之间移动变更集,例如Tailor ,它说它包括对git和darcs的支持? (该页面上也有类似系统的建议。)
否则,如果你想使用你建议的方法,你可以在HEAD
到origin/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.