git mergetool很棒(就我而言,我使用 kdiff3)。但是,无法使用它来解决来自git am或git apply(甚至与patch命令)的冲突。实际上,mergetool 在git am使用修改版本和补丁时需要 3 个文件才能工作(基本版本和两个修改版本)。
你知道一种git mergetool用于与产生的冲突的方法git am吗?
我认为有必要从修改版本和补丁中猜测基本文件。如果单独考虑每个块,看起来很棘手,但并非不可能。
当运行 git-am 来应用我从邮件列表中保存到 mbox 文件中的补丁系列时,如果 mbox 还包含求职信(也称为 PATCH [0/N]),它会抱怨如下:
\n\n128 git \xe2\x80\xa6 am --3way ~/patches/sample.mbox\nPatch is empty.\nWhen you have resolved this problem, run "git am --continue".\nIf you prefer to skip this patch, run "git am --skip" instead.\nTo restore the original branch and stop patching, run "git am --abort".\nRun Code Online (Sandbox Code Playgroud)\n\n确实,求职信是一个空补丁,因为其中不包含补丁分隔符,但我认为git am足够聪明,可以注意到它并完全跳过它。这并不是什么大麻烦,因为我可以毫无问题地跳过从 mutt 将这个补丁添加到 mbox 中,但有时补丁系列到达邮件列表时有些混乱,而且我不能只是将整个线程复制到同一个 mbox 中。 \n或者我可以手动跳过补丁,它将顺利应用。
当它确实是一封求职信时,有什么方法可以指示 git am 跳过补丁号 0 吗?
\n我有两个房间,我使用git维护一些源代码,大多数开发发生的"开发"房间和我们实际使用软件的"部署"房间.部署室中也不可避免地发生了一些变化.我希望两个房间在git中分享相同的历史.
限制:
将更改移动到部署室是很简单的git bundle,并跟踪我们移动到部署室的最后一次提交.由于纯文本限制,将更改移出房间更加困难.
目标:在两个未连接的房间之间来回移动,就像发生git pull了一样,即两个房间中的SHA1哈希相同.
至今:
我已尝试git format-patch将更改从部署移回dev,但这不记录合并,因此需要为每个连续的更改集生成不同的补丁集以及如何重现精确合并提交的一些记录发生在两者之间.有一些关于为合并提交制作差异的讨论,但这似乎并没有捕获实际的祖先,只捕获了变化.似乎补丁可能不是足够丰富的格式来提供必要的信息.
可以使用一些bundle-to-text脚本将bundle转换为非压缩和人类可读(ish)格式(然后在下载后再返回)但我没有发现存在这样的脚本的证据.
也许可以编写一个脚本来将历史记录从一些共同的祖先转到最新的提交,并且a)制作补丁或b)重新创建一些众所周知的引用的合并.
回退: 我总是可以将从部署室出来的提交压缩成一个原始补丁并打破历史记录,但是从dev-> deploy进一步下载会破坏任何现有的工作副本.不理想.
更新:
我相信git fast-export可能会做我需要的东西,虽然大多数例子都有它在整个存储库上工作,而不是像部分历史git bundle.我有一个工作的玩具示例,我可以将部分历史记录导出到一个过时的克隆,但它需要我手动编辑快速导出输出,以便我添加from <sha1>到第一个提交.如果没有这个修改,导入会创建不同的sha1,然后抱怨Not updating refs/heads/master (new tip <hash> does not contain <master's hash>).
Update2:
我的git fast-export解决方案确实有效,但它有带宽问题,因为它通过提供全新文件而不是以前文件的差异来工作.这是不可接受的,因为我实际上必须阅读所有这些额外的行.
我在 git 提交消息中使用了一些私有注释。
例如,当我修复 module 中的某些内容时MOD_A,提交消息如下所示:
FIX [MOD_A] Fixed something
Run Code Online (Sandbox Code Playgroud)
只要FIX前面有[MOD_A],如果我使用生成补丁,一切都会正常工作
git format-patch
Run Code Online (Sandbox Code Playgroud)
将此补丁作为附件发送到某处,然后使用
git am --keep-cr *.patch
Run Code Online (Sandbox Code Playgroud)
为了将此提交存储在另一个存储库中。
但是:FIX如果我前面没有[MOD_A](即[MOD_A] Fixed something),则执行后另一个存储库中会丢失消息的开头git am。整个提交消息只有Fixed something.
我怀疑它与生成的电子邮件主题行的格式有关git format-patch:
Subject: [PATCH 23/27] [MOD_A] Fixed something
Run Code Online (Sandbox Code Playgroud)
看起来因为[PATCH 23/27]被括在方括号中,所以也[MOD_A]被忽略了。
有没有办法让我[MOD_A] 不被忽视?
git am我正在运行上面的错误.手工比较我没有看到任何问题.有人可以指出错误在哪里吗?
$ git am 0012-Do-not-die-when-something-nasty-happen-in-the-comman.patch --reject
Applying: Do not die when something nasty happen in the command
Checking patch lib/Devel/DebugHooks/CmdProcessor.pm...
error: while searching for:
return 0 unless $cmd && exists $DB::commands->{ $cmd };
# The command also should return defined value to keep interaction
if( defined (my $result = $DB::commands->{ $cmd }( $args_str )) ) {
return $result unless ref $result;
# Allow commands to evaluate $expr at a debugged script context
error: patch failed: lib/Devel/DebugHooks/CmdProcessor.pm:14
Applying patch …Run Code Online (Sandbox Code Playgroud) git-am ×5
git ×4
patch ×2
format-patch ×1
git-apply ×1
git-bundle ×1
git-merge ×1
git-workflow ×1
mailing-list ×1
mbox ×1
mergetool ×1
mutt ×1