我正在尝试建立一个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
获取远程分支的本地副本(不确定需要哪些参数)我欢迎帮助充实上面的情景或者建议我应该尝试的其他内容。
想法?
答案 0 :(得分:2)
您是否曾尝试查看某些现有解决方案,以便在版本控制系统之间移动变更集,例如Tailor,它表示它包含对git和darc的支持? (该页面上也有类似系统的建议。)
否则,如果您想使用建议的方法,可以在git checkout
到HEAD
之后的每次提交中使用origin/master
来检查“分离的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线性化,这不是我想要的,就个人而言。 :)我认为最好使用现有的工具,但上述方法可以起作用。
答案 1 :(得分:1)
你可以这样做:
#!/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获得第一次提交。
答案 2 :(得分:0)
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并在每次应用时修复该代码...
答案 3 :(得分:0)
使用此方法从分支中检索哈希值:
git log --pretty=format:"%h" HEAD..origin/master
然后使用git cherry-pick -n <hash>
来应用每个。
@xenoterracide引用的另一个选择是使用githooks。