能否在保留(大部分)历史记录的情况下,将一组文件从一个git存储库移动到另一个存储库?

4

我把一些文件添加到了错误的仓库中,直到后来才意识到,而这些文件已经有了相当多的历史记录(只是线性修订,没有分支或其他内容)。

是否有可能将这些文件及其历史记录一起移动到另一个git仓库中?我不在乎它们的残余是否留在当前仓库中,只要新仓库拥有所有内容即可。


我不是GIT专家,但你能否:1.克隆目标存储库。2.将错误的源代码推送到克隆的目标中。3.重新定义你想要保留的变更集。4.仅将这些变更集推回原始存储库?正如我所说,我不是GIT专家,因此我甚至不知道这是否可能。 - Lasse V. Karlsen
还可以查看这个问题(几乎重复的)的答案。它可能是更权威的答案,已经有成千上万的浏览量。 - Randall Cook
3个回答

2
使用命令 git log -p <filename> > <patchfile>(参见 doc),可以导出文件的整个历史记录,然后通过 git apply --reverse --index <patchfile> 将其应用于其他仓库。但是,这并不会重新创建提交记录,我还 没有找到 用于执行此操作的 git-apply 开关。
如果您想从原始仓库中删除该文件,请参见 "How do I remove sensitive files from git’s history?"

1
我最终使用Ruby脚本输出了git log -p,并将其转换为一系列的patch/git add/git commit - 对于这个简单的情况来说效果很好,尽管感觉非常不正确。 - taw
1
@taw,您能否将该脚本作为答案发布到我的问题中呢?权宜之计总比没有好,未来的访问者可能会感激您的帮助。 - Tobias Kienzler
使用git版本1.7.10.3时,执行命令git apply --reverse --indexed <patchfile>会返回错误信息:error: unknown option 'indexed' - oschrenk

1

你可以按照以下步骤进行操作。

  1. 使用 git fetch 从错误的代码库将包含所需文件的分支的最新提交拉取到正确的代码库中。
  2. 使用 git filter-branch 结合 --tree-filter 或者 --index-filter 命令,将拉取的分支中除所需文件以外的所有内容删除。
  3. 使用 git rebase 或者重新将整理过的提交应用到正确的代码库的适当主分支上。

0

你可以尝试在你正在重构的分支上使用 git format-patch 命令,为该仓库上最后一次不正确提交生成补丁。
请参考这个 Stack Overflow 问题

然后你可以将这些补丁应用到正确的仓库中。
接着你需要使用 reset --hard 命令来清除多余的提交。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接