2010-04-21 97 views
9

我试图设置一个git仓库的darcs镜像。我有一些工作正常,但有一个重要的问题:如果我将一大堆提交到git仓库,这些提交合并到一个darcs补丁集中。我真的想确保每个git commit都被设置为一个darcs补丁集。我敢打赌,这可以通过做一些git fetch然后审问远程分支的本地副本,但我的git fu不能胜任这项工作。如何从远程git存储库一次提交一个提交?

这是我现在使用的(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. 通过所有的哈希值,拉动只是承诺并记录相关的补丁集循环(我敢肯定,我知道如何做到这一点,如果我得到我的手哈希)

我欢迎任何帮助去肉在以上的情况或关于的建议我应该尝试。

想法?

+0

正如一个提醒,有几个新的答案,你还没有评论。 (显然其中一个我认为其实很好地回答你的问题;)) – 2011-05-16 09:58:24

回答

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

摘樱桃将按默认上贴片。

第三部分我认为你必须写一个脚本来为你做。还有其他方法可以获得哈希值和大量日志选项。实际上,可能有一个挑选樱桃的勾或者可能只是提交后运行darcs代码。检查git钩子。

事实上,在该笔记中,在rebase中应用的每个补丁可能会调用git commit hook,因此您可能可以编写该代码然后执行git pull --rebase并将该代码钉在每个应用上...

+0

引用githooks的+1。 – jweyrich 2010-04-21 05:48:29

+1

我已经在网上研究了'git cherry-pick'的信息,这不是我想要的!它创建一个新的,独特的提交!我会深入挖掘。 – 2010-04-22 22:57:22

0

使用它从一个分支检索哈希:

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

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

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

+4

我在网上研究了'git cherry-pick'的信息,这不是我想要的!它创建一个新的,独特的提交!我会深入挖掘。 – 2010-04-22 22:57:47

2

您是否尝试过寻找移动版本控制系统之间的变更现有的一些解决方案,如Tailor,它说,它包含了Git和支持的darcs? (有该网页上的类似系统的建议为好。)

否则,如果你想用你的建议的方法,你可以使用每个git checkoutHEAD后承诺origin/master结帐,在“分离的头”提交模式。例如,修改你给的例子(在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 

注意,这将线性的历史从混帐,这将不亲自做我想做的事。 :)我认为最好为此使用现有的工具,但上述方法可以起作用。

1

你可以做这样的事情:

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

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

enter image description here

enter image description here

现在,我没有远程仓库,所以我伪造了git的提取和远程分支与本地(名为卡勒),但你明白了。只需进行完整的合并,然后备份HEAD指针,直到从原点/主机到达第一个提交。

相关问题