git存储库的部分存储库镜像

git存储库的部分存储库镜像,git,Git,我几乎可以肯定答案,但我还是在问 我需要将repo的Git历史记录发布到新服务器,但是只能从现在开始发布。也就是说,将当前提交日志压缩为初始提交,并从现在开始创建新的历史记录。理想情况下,当前服务器应该保留完整的历史记录和新提交,而第二个服务器只保留压缩的历史记录和从现在开始的新提交 据我所知,git的目的是避免这种混乱,但我可能不知道所有的特性:) 编辑:我可能不够清楚:我想在实际服务器上保留当前历史记录,在新的镜像远程服务器上启动新的历史记录。我不想一切从头开始;dr你可以,但这是一种痛苦,

我几乎可以肯定答案,但我还是在问

我需要将repo的Git历史记录发布到新服务器,但是只能从现在开始发布。也就是说,将当前提交日志压缩为初始提交,并从现在开始创建新的历史记录。理想情况下,当前服务器应该保留完整的历史记录和新提交,而第二个服务器只保留压缩的历史记录和从现在开始的新提交

据我所知,git的目的是避免这种混乱,但我可能不知道所有的特性:)

编辑:我可能不够清楚:我想在实际服务器上保留当前历史记录,在新的镜像远程服务器上启动新的历史记录。我不想一切从头开始;dr
你可以,但这是一种痛苦,它丢掉了Git的大部分价值

我猜你是在公开一个私有存储库,其中有些东西你不想让全世界看到。密码、商业秘密、对客户咒骂等等。。。与其在发布之前扔掉你的历史记录,不如重写你的历史记录以确保发布安全。用于选择性地重写历史记录并整体删除文件

然后,您可以发布新清理的、不那么尴尬的存储库


我想你需要两个这样的存储库

A - B - C - D - E - F - G [master]

            Q - E - F - G [master]
其中
A-B-C-D
是未取消的历史,
Q
是取消的提交,
E-F-G
是继续进行的提交

你能得到的最好的就是这个

A - B - C - D - E - F - G [master]

            Q - E1 - F1 - G1 [master]
其中,
E1-F1-G1
E-F-G
是相同的内容,但它们有不同的提交ID。非常不同的提交ID。完全不相关的提交ID。这是混乱的,它扔掉了Git的所有功能

Git提交是该提交的内容加上之前所有提交的内容。提交ID是提交的所有内容的校验和,如日期、作者和日志消息,以及父提交的提交ID。如果通过挤压更改存储库,则会更改提交ID,并更改位于其上的每个提交的提交ID。如果更改了提交ID,Git不会认为它们是相同的提交。

为了实现您想要的,您必须在压缩之后替换每个提交,就像它是新存储库上的新提交一样。我会这样做的。这些提交将获得新的提交ID,因此Git不会将它们识别为相同的提交。您必须手动管理上次进行樱桃采摘的时间

例如,您可以将原始存储库设置为压缩存储库的远程存储库,并使用标记跟踪同步点

              [sync]
A - B - C - D [origin/master]

            Q [master]
git cherry-pick sync..origin/master

             [sync]
A - B - C - D - E - F [origin/master]

            Q - E1 - F1 [master]
                      [sync]
A - B - C - D - E - F [origin/master]

            Q - E1 - F1 [master]
您可以定期
git fetch
获取更新

             [sync]
A - B - C - D - E - F [origin/master]

            Q [master]
然后你就可以从同步点进行选择

              [sync]
A - B - C - D [origin/master]

            Q [master]
git cherry-pick sync..origin/master

             [sync]
A - B - C - D - E - F [origin/master]

            Q - E1 - F1 [master]
                      [sync]
A - B - C - D - E - F [origin/master]

            Q - E1 - F1 [master]
并更新同步点

              [sync]
A - B - C - D [origin/master]

            Q [master]
git cherry-pick sync..origin/master

             [sync]
A - B - C - D - E - F [origin/master]

            Q - E1 - F1 [master]
                      [sync]
A - B - C - D - E - F [origin/master]

            Q - E1 - F1 [master]

与分支机构打交道会很有趣。您可以使用
git-rebase
,它可以处理分支。

仅供我理解。删除git和
git init
不会再次满足您的需要吗?因为它没有你的树的历史,它不是从零开始吗?可能是重复的感谢,但这不是我需要的。我更新了问题,以澄清历史是什么;这就是历史。提交哈希ID对提交的所有内容进行编码。使用包含现有存储库的最后一个快照的新提交创建一个新的存储库,您将有一个新的、不同的提交,它是一个新的、不同的历史记录。这两段历史将永远不同。这是你的选择:新历史,还是不。哇,非常感谢你的详细回答!因此,它们基本上是两种不同的回购协议,我必须手动保持同步。我缺少的是在同步完成后如何移动标签。无法删除标记。好的,建议每次同步完成时使用不同的标记?@Maxxer标记只是指向提交的标签。分支也只是指向提交的标签。区别在于,当您提交时,分支标签(Git称之为“heads”)将自动移动,而标记将保持不变。两者都可以任意移动<代码>git标记-f。但同样,这是一个非常糟糕的主意。我怀疑你有一个朋友。您正在询问您的解决方案,但尚未告诉我们问题所在。您最好告诉我们您正试图用此解决方案解决的问题。您完全解决了这个问题:我想发布一个干净的存储库。不是因为有任何咒骂或任何事情,只是因为我想要新回购协议的新历史。所以我认为你的答案是最好的solution@Maxxer为什么您希望现有项目有一个新的历史记录,或者更确切地说,没有历史记录?更改历史记录是理解代码的重要信息。代码告诉我们发生了什么,历史告诉我们为什么。这就是为什么我想在回购协议中保留历史:)