我在工作区的“第三方软件”子目录下克隆了许多第三方项目的 git 存储库,但是我不想保留它们的任何历史记录(最新的快照就可以了);我也在不同的存储库中的许多项目中共享许多相同的子模块(如干净的过滤器、预提交脚本等),并且不想在其中任何一个中保留历史记录。
这是两个相似但略有不同的问题:
- 是否有任何命令可以使这些 git 存储库删除所有历史快照?
- 是否有任何 git config (或其他方法)强制 git 存储库/子模块仅在以后每次拉取/子模块更新后保留最新的快照?
谢谢你。
我在工作区的“第三方软件”子目录下克隆了许多第三方项目的 git 存储库,但是我不想保留它们的任何历史记录(最新的快照就可以了);我也在不同的存储库中的许多项目中共享许多相同的子模块(如干净的过滤器、预提交脚本等),并且不想在其中任何一个中保留历史记录。
这是两个相似但略有不同的问题:
谢谢你。
您可以运行git fetch
with--depth
将现有(非浅层)存储库转换为给定深度的浅层存储库。您可能还希望删除除一个分支名称(一个本地分支和一个相应的远程跟踪分支)之外的所有分支名称,并将fetch =
指令更改为匹配。如果有标签,您可能还需要修剪部分或全部标签。您保留的任何引用都将保留提交及其引用的对象。
这对于常规存储库来说很好,但正如VonC 在他对Git 浅子模块和评论中提到的 ad22的回答中指出的那样:
...确定固定在子模块中的修订所需的确切深度几乎无法猜测,并且是一个移动目标
如果您控制服务器,并且拥有足够新的 Git,则可以启用 fetch-by-hash-ID,这将允许直接获取子模块的哈希 ID,这也可以解决这个问题。如果不是——如果你不控制服务器或者你的 Git 不是那么新——你会发现子模块又一次获得了他们的“sob-modules”绰号。
第一个答案:
删除该.git
文件夹可能会导致您的 git 存储库出现问题。如果您想删除所有提交历史记录但将代码保持在其当前状态,则按照以下方式执行此操作非常安全:
查看
git checkout --orphan latest_branch
添加所有文件
git add -A
提交更改
git commit -am "commit message"
删除分支
git branch -D master
将当前分支重命名为 master
git branch -m master
最后,强制更新您的存储库
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 检出。