有没有办法让使用git format-patch创建的补丁兼容svn,以便我可以将它提交给svn repo?
我正在使用github上的svn repo工作,并希望将我的更改提交回主回购.我需要创建一个补丁来执行此操作,但是补丁无法应用,因为git格式的补丁与svn不同.我还没有发现一些秘密吗?
更新:虽然目前没有脚本或本机git方式来做到这一点,但我确实设法找到了今年早些时候关于如何手动完成此任务的帖子.我已按照说明操作,并成功将我的git补丁与svn配合使用.
如果有人可以尝试编写脚本来实现这一目标并为git项目做出贡献,那么我将非常感激.
http://kerneltrap.org/mailarchive/git/2008/1/15/570308/thread#mid-570308
我一直在使用git-format-patch和git-am将更改从一个存储库应用到另一个存储库.文件结构是相同的,但我应用的存储库中有一些更改,这会导致大多数补丁失败.但是,大多数补丁并不适用于线号中的一点点模糊性.
至于我能说出git-am apply一个非常严格的解释,所以完全拒绝所有这些补丁.
所以我的工作流程已成为
$ git am ../the-patch.patch
# Fails because the patch doesn't apply cleanly
$ patch -p1 < ../the-patch.patch
# Applies most of the hunks, leaves .rej files for the ones that conflict
# Fix the conflicting hunks manually
$ git am --continue
Run Code Online (Sandbox Code Playgroud)
如果我不必运行命令行补丁并且可以将其作为am命令的一部分发生,那将是很好的.
使用该--reject标志运行似乎会创建一个.rej文件,其中包含文件中的所有文件,如果有任何冲突,这不是我想要的.
使用--3way标志运行失败
fatal: sha1 information is lacking or useless (the-file.java).
Repository lacks necessary blobs to fall back on 3-way merge.
Cannot fall back to three-way merge.
Run Code Online (Sandbox Code Playgroud)
我认为是因为这个基于的变更集不在我正在合并的存储库中.
有没有办法 …
我需要为我们的审核过程获取初始提交(非空)的补丁文件,但我很困惑,因为git format-patch命令只能从初始提交时不包含它的分支进行.
似乎它必须是一些明显的举动,但我完全错过了它.
在运行git format-patch时,目的是创建您编写的代码的电子邮件表示.到现在为止还挺好.我不是电子邮件专家,但在我看来,这种格式补丁输出的第一行不是标准的电子邮件标题格式......
From de8d128fb520416e0b029c913b3a5ce900d0320c Mon Sep 17 00:00:00 2001 Message-Id: From: Christopher Harvey Date: Wed, 3 Apr 2013 10:17:52 -0400 Subject: [PATCH 0/3] *** SUBJECT HERE *** To: Christopher Harvey *** BLURB HERE *** Christopher Harvey (3): commit 2 commit 3 commit 4 data | 3 +++ 1 file changed, 3 insertions(+) -- 1.7.12.4
是什么From de8d128fb520416e0b029c913b3a5ce900d0320c Mon Sep 17 00:00:00 2001?是什么日期?它看起来对我来说是任意的,它也阻止我将它传递给sendmail.每次我想发送补丁时,我都必须手动删除该行.
谢谢.
我有一系列我想要发送给开源项目的补丁但是我无法弄清楚如何正确格式化电子邮件.我尝试运行git format-patch命令然后将它们全部附加到来自Thunderbird的电子邮件中,但它们都被拒绝了,因为每个补丁本身应该是一个单独的电子邮件.我想避免使用git email命令,因为我在私有的同一个树中有代码,我需要发送一些代码,这意味着我需要能够在发送之前手动查看每封电子邮件.
我想继续使用Thunderbird,但它似乎有问题,因为它包装线并使补丁无法使用.我也尝试过设置fetchmail和mutt,但经过10个小时的阅读和尝试,我放弃了.是否有用于发送git补丁的非fetchmail和非thunderbird解决方案?
我用三个提交创建了一个补丁
git format-patch <revision_three_commits_ago>
Run Code Online (Sandbox Code Playgroud)
这会创建三个我从笔记本邮寄的补丁文件,并在我的桌面计算机上读取邮件(两个都是Windows框).
我什么时候做
git am --3way --ignore-space-change *.patch
Run Code Online (Sandbox Code Playgroud)
补丁适用,但我没有为提交获得相同的SHA1 ID.在修补文件中搜索了一下,我发现台式计算机上的修改后的行结束了LF,而笔记本上的修改后的行(我创建了修补程序)结束了CR LF.
所以,我的第一个念头就是打电话给git am没有--ignore-space-change,但是这给了我一个错误(补丁不适用).
我怎么能告诉git format-patch或者git am如何处理行结尾(msysgit 1.7.4)?
难道我真的拿VIM和更改文件格式UNIX来DOS之前,我可以应用补丁?
编辑:甚至没有用VIM修改补丁文件有帮助:我想,set ff=dos一个:%s/^M//g会有所帮助,但事实并非如此!
在我看来,应用补丁应该会产生完全相同的内容,也会产生相同的提交哈希值,就像我从创建补丁的其他repo中提取的那样.我错了吗?
我们目前正在从 CVS 迁移到 git 存储库。然而,一个团队大约一年前已经将 cvs2git 用于他们的存储库,因为他们的新功能需要大量具有历史记录的移动文件,而 CVS 在历史上并不擅长。然后,两个存储库都应该将 GIT-LFS 用于我们更大的签入源(例如,预先构建的外部库)
我们的想法是创建相同的起点,以便在迁移后将所有更改与历史记录合并到我们的存储库中。
所以我已经有了起点的精确复制品;这个想法是现在使用 git format-patch 创建所有补丁文件。现在大多数补丁都运行良好,问题仅在于使用 git lfs 的补丁。
一个例子:
diff --git a/Foo/bar/baz.zip b/Foo/bar/baz.zip
new file mode 100644
index 00000000000..6fce3f4bd05
--- /dev/null
+++ b/Foo/bar/baz.zip
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:c90b657621e07fa40476186d94e2f6e06f055b49294b83ee976f73dfac120d86
+size 116056
--
2.13.2.windows.1
Run Code Online (Sandbox Code Playgroud)
当我尝试应用该补丁时,会发生以下情况:
$ git am ../patches/mypatch.patch
Applying: #someTfsId: myCommit
Downloading Foo/bar/baz.zip (113.34 KB)
Error downloading object: Foo/bar/baz.zip (c90b657): Smudge error: Error opening media file.: open D:\repositories\myrepo\.git\lfs\objects\c9\0b\c90b657621e07fa40476186d94e2f6e06f055b49294b83ee976f73dfac120d86: The system cannot find the file specified.
Errors logged …Run Code Online (Sandbox Code Playgroud) 我有理由\xc2\xb9 使用 git-format-patch 和选项创建我的 git 提交作为补丁文件--no-prefix。
此选项更改补丁输出,以不在补丁文件的文件路径中添加 git-diff 特定的前缀a// 。b/它允许应用补丁文件等工具,patch而无需作为-p1参数传递。
到目前为止一切都很酷。然而,我似乎无法再用 Git 本身(git-am)来实际应用它们:
\n\n$ git am path/to/0001-patch.patch\nApplying: <commit message subject>\nerror: <path>: does not exist in index\nPatch failed at 0001\n[...]\nRun Code Online (Sandbox Code Playgroud)\n\n我现在如何应用它们git-am,同时保持简单的patch兼容性?
\xc2\xb9 它允许我在 Bazel 中将其用作补丁文件,而无需自定义补丁命令,因为您需要使用patch -p1 [...].
我正在尝试将未提交的更改从本地 git 存储库移动到另一个本地存储库。在 repo 1 上,我创建了一个如下所示的补丁:
git diff > my_patch.patch
Run Code Online (Sandbox Code Playgroud)
检查补丁:
more my_patch.patch
Run Code Online (Sandbox Code Playgroud)
git diff 我得到与在第一个存储库上运行相同的输出。在第二个仓库中我运行:
git apply --stat my_patch.patch
0 files changed
Run Code Online (Sandbox Code Playgroud)
如果我跑步,git apply my_patch.patch我不会有任何效果。
我创建的补丁错误吗?我应用错了吗?
重现问题的步骤:
git diff > ~/my_patch.patchgit apply ~/my_patch.patchgit status。没有变化!建议另一种将未提交的更改转移到另一个本地存储库的方法也可以很好地解决我的问题。
我们假设有两个分支,master并且slave,它们编辑同一个文件和同一行.最初,文件的内容是
foo bar
Run Code Online (Sandbox Code Playgroud)
然后在分支slave中编辑成为
foo bar baz
Run Code Online (Sandbox Code Playgroud)
现在,分支的用户slave格式化patch(git format-patch master)并将其发送给分支的用户master.同时,在分支master中编辑相同的文件并成为
foo bar spam eggs
Run Code Online (Sandbox Code Playgroud)
无法应用修补程序,并master要求slave合并并创建新修补程序.何时master合并slave并解决冲突,是时候重新格式化补丁.提交图如下所示:
slave: master:
foo bar baz spam eggs
| \
| \
| foo bar spam eggs
| |
foo bar baz |
\ |
\ |
+--------- foo bar
Run Code Online (Sandbox Code Playgroud)
最新的提交(合并)slave看起来像:
@@@ -1,1 -1,1 +1,1 @@@
- foo bar baz
-foo bar …Run Code Online (Sandbox Code Playgroud) 我想为对文件/文件夹所做的所有提交获取补丁。
我可以通过 git log --format="%H"-- path/to/folder
有没有办法从这个列表中生成补丁。
[编辑]:
下面的代码部分解决了我的问题
for c in `git log --format="%H" -- path/to/file`;do
git format-patch "$c^1".."$c" -o patches ;
done
因为 format-patch 是单独调用的,所以我会得到所有编号为 0001-commit-text.patch 的补丁,我将失去补丁的顺序。有没有更好的解决办法
我在 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] 不被忽视?
我在 GitHub 存储库上有一个特定的提交,我想从中提取补丁以应用到不同的地方,类似于我在使用git format-patch.
我很懒,或者存储库太大,我不想为了提取该补丁而获取整个存储库。
我怎样才能快速做到这一点?