8

我正在尝试设置 git 存储库的 darcs 镜像。我有一些可以正常工作的东西,但是有一个重大问题:如果我将一大堆提交推送到 git 存储库,这些提交会合并到一个 darcs 补丁集中。我真的很想确保每个 git 提交都设置为单个 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. 循环遍历所有哈希,仅提取该提交并记录相关的补丁集(我很确定如果我得到哈希,我知道该怎么做)

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

想法?

4

4 回答 4

2

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

否则,如果您想使用建议的方法,您可以git checkout在每次提交之后使用HEADorigin/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 的历史线性化,这不是我个人想要的。:) 我认为最好使用现有的工具,但是可以使上述方法起作用。

于 2010-09-07T08:55:32.927 回答
1

你可以这样做:

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

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

在此处输入图像描述

在此处输入图像描述

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

于 2011-04-27T21:55:53.740 回答
0

使用它从分支中检索哈希:

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

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

@xenoterracide 引用的另一个选项是使用 githooks。

于 2010-04-21T05:36:15.290 回答
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 钩子。

事实上,在那张纸条上,rebase 中应用的每个补丁都可能调用一个 git commit 钩子,因此您可以编写它,然后执行 git pull --rebase 并将该代码钉在每个应用上......

于 2010-04-21T05:16:19.810 回答