- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
问题
我想将一个文件夹(和子文件夹包含的文件)从一个存储库移动到另一个存储库,以保留历史记录。
我在 SE 上找到了一种方法:How to move files from one git repo to another (not a clone), preserving history .关于 blog.neutrino.es 的不同想法.这是我想在这里讨论的最后一个。
尝试的解决方案
mkdir /tmp/mergepatchs
cd ~/repo/org
export reposrc=myfile.c #or mydir
git format-patch -o /tmp/mergepatchs $(git log $reposrc|grep ^commit|tail -1|awk '{print $2}')^..HEAD $reposrc
cd ~/repo/dest
git am /tmp/mergepatchs/*.patch
如果我没理解错的话,这个想法是假装我们要通过电子邮件提交提交,然后将它们重新导入到另一个存储库中。
错误
我在执行 git am/tmp/mergepatchs/*.patch
时收到此错误消息:
Applying: Initial commit
error: .gitignore: already exists in index
error: README.md: already exists in index
Patch failed at 0001 Initial commit
The copy of the patch that failed is found in:
/Users/myuser/repo/org/.git/rebase-apply/patch
When you have resolved this problem, run "git am --continue".
If you prefer to skip this patch, run "git am --skip" instead.
To restore the original branch and stop patching, run "git am --abort".
为了更好地理解这个过程,我首先尝试了一个文件(而不是整个目录)。然而在 git am
之后“什么都没有”发生(即没有新文件,git status
不报告任何变化)。这是为什么?
然后我尝试了:
INITCOMMIT=$(git rev-list --parents HEAD | egrep "^[a-f0-9]{40}$")
git format-patch -1 -o /tmp/mergepatchs ${INITCOMMIT}
但是又得到了和之前一样的错误信息。
为什么补丁会失败?
编辑 1
我尝试了一些相关的东西,灵感来自 How to create and apply a patch with Git .
在 ~/repo/org
中:
$ git format-patch --root HEAD --stdout myfile.c > /tmp/mergepaths/01.patch
在 ~/depo/dest
中:
$ git apply --stat /tmp/mergepaths/01.patch
0 files changed
$ git apply --check /tmp/mergepaths/01.patch
$ git am < /tmp/mergepaths/01.patch
stat
和check
都告诉我“什么都不做”。补丁对象远非空。顺便说一句,我不知道这是否相关,但是补丁的创建和应用都是在分支中完成的。
最佳答案
有这样的手术工具,git filter-branch
.
对于这么简单的事情,您不需要太多的安全网。不过,作为引用,这就是我做任何可能弄脏历史、命名空间或工作树的事情的方式
# make a throwaway sandbox to play in:
git clone -s . /tmp/deleteme
cd !$
git checkout -b sliced
# do it
git filter-branch --subdirectory-filter your/subdir
# and if the result looks good:
git push origin sliced
你可以推送到任何你有 url 或路径的 repo,只需直接使用 url 而不是为 onesy-twosie 工作创建远程名称。推送并重命名:git push u://r/l sliced:branchnameinthatrepo
从您想要选择和重新定位子目录的评论中。这是一些相当简单的 git read-tree
工作。 Read-tree 对索引进行操作,因此您需要一个索引过滤器。也就是说,这个:
git filter-branch --index-filter '
git read-tree --prefix=des/ti/nation/ $GIT_COMMIT:source/subdir
git read-tree -m $GIT_COMMIT `git mktree </dev/null`
'
尽管您不熟悉它,但如果您只记得 git 的工作原理,它就会非常简单。
作为提醒、回顾或介绍,视情况而定:
适当的存储库是一个对象存储:通过类型和唯一名称(又名 SHA1)请求任何东西,存储库会主动返回它;要求 repo 记住任何内容,你给它类型和字节,它 (a) 存储它,(b) 给你它的唯一名称。
索引只是一个列表,将路径名映射到存储库内容。
git read-tree
是 checkout 、 merge 和重置的基础操作——它实际上并不对存储库进行操作,它使用的所有对象都已经存在。您向它提供现有的树,它会将它们与索引中的内容结合起来(并可选择更新工作树,尽管这在这里无关紧要)以生成您想要的索引,或者至少让您更接近它。
上面的第一个read-tree是
git read-tree --prefix=destination/subdir/ $GIT_COMMIT:source/subdir
你可以确定什么的基本性质git read-tree
将通过计算你给了它多少棵树来完成。这是一个单树读取,在这里用于添加到索引(编辑: 顺便说一句,没有选项,1-tree git read-tree
replaces the index)。此处添加的树位于 source/subdir
在被过滤的提交中,read-tree 使用 destination/subdir/
将其全部添加到索引中添加到路径名的前面。
下一个读取树是一个二叉树读取,它为 git checkout
做索引(和工作树,如果你想在这里做的话)。 -- 它将原始树和目标树之间的差异应用于索引。在这里,原始树是 $GIT_COMMIT
和目标树,git mktree </dev/null
, 是空树。所以操作是“在索引中找到原始树中的所有内容,并使所有这些条目看起来与目标树完全一样”,也就是这里“让它们全部消失”。上面添加的目标子目录不涉及,它不在原始树中,因此读取树不会使它消失。
过滤器已完成,filter-branch 提交新索引中的内容(记住,已经在 repo 中的内容),是时候进行下一次提交了。
read-tree docs .此链接跳过描述,这是故意的。不要读它。
关于git - 如何使用 `git format-patch` 和 `git am` 将文件从一个 git repo 移动到另一个保留历史记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28830916/
我正在尝试使用 Android SDK 中的 Draw9Patch 工具,但在使用 Draw9Patch 打开我的图像后,它立即将我的所有图像区域显示为“坏补丁”。我手动绘制了定义可拉伸(stretc
我有一个运行补丁命令的构建工具,如果补丁命令返回非零值,它将导致构建失败。我正在应用一个可能已经或可能尚未应用的补丁,所以我使用 -N选项 patch ,它应该跳过。但是,当它确实跳过时,patch返
patching file chrome/browser/gpu_process_host_ui_shim.cc Unreversed patch detected! Skipping patch.
尝试查看哪些模型最适合api(更新少,但对象结构可能经常更改,高读取应用程序) 我有这样的资源 Epic(ID、名称、描述、开始日期、结束日期、状态、故事) 故事(ID、名称、说明、开始日期、结束日期
我创建了新问题,因为我觉得上一个问题已经得到解答,这属于一个新的地方。 我跑 bitbake core-image-minimal我收到以下错误: ERROR: systemd-1_232-r0 do
我正在使用 ColdFusion 10 与 PayPal 的服务器和 for some requests 进行通信我需要执行 HTTP PATCH 请求 are not supported by CF
我试图了解这两种模拟方法之间的区别。有人可以帮助区分它们吗?对于这个例子,我使用 passlib 库。 from passlib.context import CryptContext from un
WebTarget webTarget = httpClient.target(url); Invocation.Builder invocationBuilder = webTarget.reque
当提到“提交补丁”时,补丁这个词究竟是什么意思? 我已经看到它被大量使用,尤其是在开源世界中。它是什么意思,提交补丁到底涉及什么? 最佳答案 这是一个文件,其中列出了已更改的代码文件之间的差异。它通常
对于 matplotlib.patches,patch.contains_point(xy) 方法似乎与 patch.get_path().contains_point(xy) 不同,至少在拥有之后将
这是什么RFC 5789说: The PATCH method requests that a set of changes described in the request entity be ap
在 Draw 9-patch 中,一切看起来都很好。 但是,我的 SDK 说 9-patch png 格式不正确。因为我有类似 11-patch png 的东西。因为我不希望小抓取区域被缩放。如何让它
我创建了一个使用 javax.xml.ws.Endpoint 来创建 REST 端点的类: @WebServiceProvider @ServiceMode(value = javax.xml.ws.
语境 我有一个 spring boot (version 2.2.6.RELEASE) web 项目。 从这个 Web 应用程序(我称之为“APP1”)我想使用来自另一个 Web 应用程序的 PATC
在为我的应用程序编写单元测试时,我一直使用 @mock.patch 和 @patch.object 装饰器。但是现在,当我使用装饰器进行一些单元测试时,我收到错误消息“TypeError: stati
我在使用@mock.patch.object 函数时观察到 nosetests 的一个非常奇怪的行为: 当我同时运行多个测试时,我得到的结果与单独运行它们时不同。具体来说,在某些情况下,当我一起运行多
我正在使用 RestSharp v107。 我想更新测试用例的迭代路径。我可以使用 Postman 更新它,但使用 RestSharp 我收到“BAD Request”-“您必须在请求正文中传递有效的
我已经阅读了 GNU 项目中关于开源和其他许可证的文章。某些许可证允许您将更改发布为补丁,而不是完整的源代码(例如 Q 公共(public)许可证或 gnuplot 许可证)。这是什么意思?这样的补丁
有谁知道免费的优质补丁程序?您知道,可以将其中包含旧程序的目录放入其中,然后将其与具有新版本的目录进行比较,然后吐出一个补丁,这仅仅是两者之间的区别? 另外,我正在寻找可以修补整个目录的东西,而不仅仅
由于我当时一直在使用 Subversion 和 shell 工具,git-gui这些都是不可能的。是否有任何 shell 工具可以交互式地逐行应用补丁? 最佳答案 尝试通过 --dry-run选项 p
我是一名优秀的程序员,十分优秀!