2

我在工作区的“第三方软件”子目录下克隆了许多第三方项目的 git 存储库,但是我不想保留它们的任何历史记录(最新的快照就可以了);我也在不同的存储库中的许多项目中共享许多相同的子模块(如干净的过滤器、预提交脚本等),并且不想在其中任何一个中保留历史记录。

这是两个相似但略有不同的问题:

  • 是否有任何命令可以使这些 git 存储库删除所有历史快照?
  • 是否有任何 git config (或其他方法)强制 git 存储库/子模块在以后每次拉取/子模块更新后保留最新的快照?

谢谢你。

4

2 回答 2

1

您可以运行git fetchwith--depth将现有(非浅层)存储库转换为给定深度的浅层存储库。您可能还希望删除除一个分支名称(一个本地分支和一个相应的远程跟踪分支)之外的所有分支名称,并将fetch =指令更改为匹配。如果有标签,您可能还需要修剪部分或全部标签。您保留的任何引用都将保留提交及其引用的对象。

这对于常规存储库来说很好,但正如VonC 在他Git 浅子模块评论中提到的 ad22的回答中指出的那样:

...确定固定在子模块中的修订所需的确切深度几乎无法猜测,并且是一个移动目标

如果您控制服务器,并且拥有足够新的 Git,则可以启用 fetch-by-hash-ID,这将允许直接获取子模块的哈希 ID,这也可以解决这个问题。如果不是——如果你不控制服务器或者你的 Git 不是那么新——你会发现子模块又一次获得了他们的“sob-modules”绰号。

于 2017-06-01T15:01:30.827 回答
0

第一个答案:

删除该.git 文件夹可能会导致您的 git 存储库出现问题。如果您想删除所有提交历史记录但将代码保持在其当前状态,则按照以下方式执行此操作非常安全:

  1. 查看

    git checkout --orphan latest_branch

  2. 添加所有文件

    git add -A

  3. 提交更改

    git commit -am "commit message"

  4. 删除分支

    git branch -D master

  5. 将当前分支重命名为 master

    git branch -m master

  6. 最后,强制更新您的存储库

    git push -f origin master

笔记 :

这不会保留您的旧提交历史记录

第二个答案:

您可以在每次拉取或提交之前将当前的 git 存储库克隆到不同文件夹中的本地存储库。

句法 :

git clone -l -s -n [sourceFolder] [destinationFolder]

例子 :

git clone -l -s -n . ../repo-backup

笔记 :

-l = 当要克隆的存储库位于本地计算机上时

-s = 当要克隆的存储库在本地计算机上时,而不是使用硬链接,自动设置.git/objects/info/alternates 为与源存储库共享对象。

-n = 克隆完成后不执行 HEAD 检出。

于 2017-06-01T09:01:36.570 回答