Git:将本地仓库复制到另一个文件夹

3

假设我有一个本地的git仓库(“A”),里面有很多不想发布的提交记录。

如果我将除了.git目录之外的所有东西都复制到一个新文件夹中(我们称其为“B”),并在那里git init另一个仓库,这样做会不会对第一个命名为“A”的本地仓库造成混乱,并丢失该仓库的提交历史记录?


1
你应该编辑你的问题并给两个仓库起虚拟名称(例如A和B);这将使问题更容易理解。 - jub0bs
@Jubobs 现在怎么样? - sslss
好多了。答案是否定的。将repo A的工作树复制到另一个文件夹B对repo A没有影响...只要文件夹B不嵌套在A中。 - jub0bs
No nesting. Thanks @Jubobs! - sslss
2个回答

4
.git 子目录将一个目录变成一个 git 仓库。如果你移除它(或者复制除了 .git 子目录以外的所有内容),那么你就有了一个不是 git 仓库的项目,也没有与任何 git 仓库相关联。
在 "B" 目录中运行 git init 将创建一个新的 git 仓库,该仓库与原始仓库 ("A") 或任何其他仓库都没有关联。
但请记住,在 git init 之后,"B" 仓库是一个不同的项目(具有全新的、空的历史记录),而不是旧的 "A" 仓库,将它们链接起来(即使可能)将生成重复的提交和冲突。(感谢 @NickVolynkin 指出这一点)
当你有一些不想发布的提交时,通常的解决方案是将它们放在一个新分支上,并记住不要进行 push

在初始化之后将它们链接起来会导致冲突。它们已经有了不同的历史记录。对于所有其他语句,我完全同意并支持。 - Nick Volynkin
1
@NickVolynkin 你是对的。我在答案中提到了你的建议。 - axiac

2

使用存档设置进行复制

从父目录开始:

cp -a repo-A repo-B

将创建一个副本仓库,不会对A仓库进行任何修改,除非是atime(取决于您的文件系统),但Git无论如何都不会跟踪它。

两个仓库在功能上完全相同,包括历史记录和未提交的工作。然后,您可以独立地对任一仓库进行任何更改。

注意事项

如果您使用了--shared标志进行克隆,或设置了.git/objects/info/alternates,即使创建了存档副本,您可能仍然在仓库之间共享文件。这不是一般情况,但如果您已经这样做,就必须注意并采取特殊预防措施。买家自负。


请注意,OP只是在询问如何复制工作树:但不包括git目录 - jub0bs
@Jubobs 不要把事情搞得太复杂。如果你想的话,可以复制它,然后在其中一个目录中删除.git目录。如果您想要自行车棚并添加诸如特定于Shell的扩展全局来排除模式之类的复杂性,请随意发布您自己的答案,但奥卡姆剃刀适用于此处。 - Todd A. Jacobs
我并没有提出任何建议;我只是指出OP正在询问将repo的工作树复制到其他地方的后果,而不是如何仅复制该工作树。 - jub0bs
@CodeGnome 我不知道这个,我会更深入了解一下。谢谢! - sslss
cp -r ./old-directory ./new-path/new-directory将旧目录复制到新路径下的新目录。 - gsk_fs

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