如何使Git存储库或子模块更浅

时间:2017-06-01 06:56:24

标签: git git-submodules shallow-clone

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

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

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

谢谢。

2 个答案:

答案 0 :(得分: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

  7. 注意:

      

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

    第二回答:

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

    语法:

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

    示例:

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

    注意:

      

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

         

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

         

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

答案 1 :(得分:0)

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

这对于常规存储库来说很好,但是VonC noted in his answerGit shallow submodulesad22 mentioned in a comment

  

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

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