在某个时刻使用远程存储库时,我在运行时开始收到此消息git fetch origin
在后台自动打包存储库以获得最佳性能。
请参阅“git help gc”以了解手动内务管理。
警告:上次 gc 运行报告以下内容。请更正根本原因并删除 .git/gc.log。
在删除文件之前,不会执行自动清理。
警告:有太多无法触及的松散物体;运行“git prune”来删除它们。
这事儿常常发生。我找到了应该有帮助的地方git gc,但它只工作一次(或似乎工作) - 在此之后和之后git fetch origin我得到
在后台自动打包存储库以获得最佳性能。请参阅“git help gc”以了解手动内务管理。
后来情况又重复了。我还尝试删除 .git/gc.log - 它没有帮助。
我的 git 技能确实有限。为什么我会收到此警告以及如何长期解决该问题?
我正在开发一个git课程,并且想提一下,在跑步之前,丢失的裁判并没有真正丢失git gc.但验证这一点,我发现事实并非如此.即使在运行git gc --prune=all --aggressive丢失的裁判后仍然存在.
显然我误解了一些东西.在说出不正确的课程之前,我想直截了当地说明事实!这是一个示例脚本说明了效果:
#!/bin/bash
git init
# add 10 dummy commits
for i in {1..10}; do
date > foo.txt
git add foo.txt
git commit -m "bump" foo.txt
sleep 1
done;
CURRENT=$(git rev-parse HEAD)
echo HEAD before reset: ${CURRENT}
# rewind
git reset --hard HEAD~5
# add another 10 commits
for i in {1..10}; do
date > foo.txt
git add foo.txt
git commit -m "bump" foo.txt
sleep 1
done;
Run Code Online (Sandbox Code Playgroud)
这个脚本将添加10个虚拟提交,重置为过去的5个提交,并添加另外10个提交.在重置之前,它将打印它当前HEAD的哈希值.
我希望CURRENT在跑步后失去对象 …
I'm using Git to version a series of binary files. They compress pretty well, but my central repos do not seem to be compressing when I push to them. They're eating up a decent amount of my quota, so I was looking to see if there was a way to force the remote repo to do a GC.
Is this possible? I'm working on Project Locker so I don't believe I have SSH access to go in and GC the …
假设我想编写一个小助手,它允许将一些元数据附加到存储库中,这种方式可以通过refs. 简单示例(一个git-notes克隆原型,甚至不将注释附加到任何其他 git 对象):
hash=$(echo "Just a comment" | git hash-object -w --stdin)
git update-ref refs/comments/just $hash
Run Code Online (Sandbox Code Playgroud)
即我blob用哈希创建一个hash并引用它,因为refs/comments/just这样git fsck --unreachable不会抱怨它,git gc也永远不会prune是对象。
但这当然是一个非常简单的例子,实际上我对更复杂的功能感兴趣。在那里,我的问题是,我可以“合法”做什么,我绝对应该避免什么?
例如,SE 上的一些帖子是关于用户必须从重复tree条目中恢复的。因此,“不要”就是“不要创建tree具有重复条目的条目”。另一个例子是“你确保你的对象是可到达的,所以git prune不会删除它们。” 还有什么?
我可以创建自定义对象类型吗?对树中的 blob 使用“无效”文件模式?在哪里可以找到概览?或者我应该git-fsck手动检查's source 以查看什么构成错误(哪些是可以忽略的)?
在过去,人们git gc不时要求援引.我现在读到,最新的Git版本应该自动执行清理.它是否正确?
我@daily在crontab git gc上有一个在所有repos上运行的工作.我正在尝试为作业设置日志文件,但I/O重定向不会产生我正在寻找的结果; 我得到一个空白文件.
我已经做了所有常规的事情>,2>&1等等没有任何成功.
有人提到我git gc使用ncurses的输出程序将输出直接抛出到控制台,从而绕过stdout/stderr(如果我错了,请纠正我).
有人能指出我正确的方向吗?
Git 的文档谈论“悬空”对象,而文档fsck只谈论“gc松散的对象”。有严格的划分。
但是,在浏览一些相关的 SO 帖子时,这些术语似乎可以互换使用。在Git Book v2和 Git 的源代码中也是如此:
(main) $ git checkout v2.33.0
(225bc32) $ rg 'dangling (object|commit|blob|tag|tree)' | wc -l
31
(225bc32) $ rg 'loose (object|commit|blob|tag|tree)' | wc -l
117
Run Code Online (Sandbox Code Playgroud)
最后,这两个命令经常按顺序使用,从它们的行为中我可以清楚地看出它们的目标是相同的。
因此,“悬空”和“松散”只是同一概念的两个相似术语。这个总结正确吗?
或者“松散的物体”是一个类别,而“悬空”是故意为特定类型的物体保留的?
简单的问题,我试图git gc在配额的机器上运行.Pre-gc,我的使用率约为18GB,几乎所有这些都是我克隆的git存储库.我的磁盘限制为25GB.在git gc操作期间,足够的临时文件被写入磁盘以达到我的极限,从而导致git gc操作失败.
我可以.git/objects/pack/tmp_pack_*在失败的操作后删除它并恢复到18GB的使用率,但我真的想完成git gc并回收一点性能.
是否有一些花哨的选项(或一系列其他git命令),我可以使用,不涉及首先写入> 7GB的临时文件到磁盘?
我想知道:Git什么时候进行垃圾收集?我知道在过去必须调用git gc手动启动垃圾收集,但现在它是自动完成的,何时?
另外,是否需要在最新的Git版本中手动调用它?
启动后在后台发生了什么,
git gc git prune输出git gc:
Counting objects: 945490, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (334718/334718), done.
Writing objects: 100% (945490/945490), done.
Total 945490 (delta 483105), reused 944529 (delta 482309)
Checking connectivity: 948048, done.
Run Code Online (Sandbox Code Playgroud)
git prune的输出:
Checking connectivity: 945490, done.
Run Code Online (Sandbox Code Playgroud)
这两个选项有什么区别?
谢谢
git ×10
git-gc ×10
git-fsck ×2
bash ×1
git-fetch ×1
git-hash ×1
git-plumbing ×1
git-refspec ×1
git-remote ×1
quota ×1