在我公司范围的存储库的本地副本上(我非常经常地创建许多短期分支和git rebase
,并且许多其他人也将短期分支推送到{{1我从中拉出来,我经常与git进行以下对话。
origin
```
那就是:我说(env)$ git pull
remote: Counting objects: 382, done.
remote: Compressing objects: 100% (247/247), done.
remote: Total 382 (delta 182), reused 62 (delta 62), pack-reused 73
Receiving objects: 100% (382/382), 228.63 KiB | 0 bytes/s, done.
Resolving deltas: 100% (232/232), completed with 15 local objects.
From github.com:anon/anony2
aee962f..055a717 master -> origin/master
[...]
Auto packing the repository in background for optimum performance.
See "git help gc" for manual housekeeping.
error: The last gc run reported the following. Please correct the root cause
and remove .git/gc.log.
Automatic cleanup will not be performed until the file is removed.
warning: There are too many unreachable loose objects; run 'git prune' to remove them.
Updating aee962f..055a717
Fast-forward
Auto packing the repository in background for optimum performance.
See "git help gc" for manual housekeeping.
error: The last gc run reported the following. Please correct the root cause
and remove .git/gc.log.
Automatic cleanup will not be performed until the file is removed.
warning: There are too many unreachable loose objects; run 'git prune' to remove them.
[...]
9 files changed, 128 insertions(+), 95 deletions(-)
(env)$ git prune
Checking connectivity: 772524, done.
(env)$ rm .git/gc.log
(env)$
; git向我吐了一堆东西,有用地包括我需要运行的两个命令;我运行这些命令;然后我可以继续我的工作。
如果git只是为我运行这些命令,而不是强迫我剪切并粘贴它们,那将是非常棒的。我知道这不会是git pull
的默认行为,但它似乎可能作为我可以添加到git pull
的选项而存在。这样的事情存在吗?
答案 0 :(得分:5)
问题很可能是你生成的松散物体足够快,实际上超出了the default git gc
protection time of 2.weeks.ago
:
--prune=<date>
修剪比日期更早的松散物体(默认为2周前, 可以通过配置变量gc.pruneExpire
覆盖。 --prune =所有 修剪松散的物体,不论其年龄(不要使用 --prune = all除非你确切知道自己在做什么。除非 存储库是静止的,你将丢失新创建的对象 没有锚定裁判并最终腐蚀你的 库)。 --prune默认开启。
这里发生的事情是git gc
在后台自动修剪松散的对象及其默认机制,即运行git prune --expire=2.weeks.ago
(或者为gc.pruneExpire
配置的任何内容) 。但这留下了足够松散的物体git gc
认为它修剪工作很差。
运行git prune
没有过期时间(如手动git prune
),或--prune=all
中的git gc
,会删除所有松散对象。如果没有其他Git命令正在运行,这是安全的。由于git gc --auto
在后台运行,因此需要一个安全边际 - 但是两周对于您的使用来说太多了。
如果您确信您的各种Git命令只需一周,甚至一天即可完成,则:-)您可以将gc.pruneExpire
配置为1.week.ago
或1.day.ago
让它更积极地修剪。除非你生成了大量的松散物体,否则这可能会起到作用:
$ git config gc.pruneExpire 3.days.ago
请注意,以这种方式设置时,只更改此存储库的设置,并覆盖任何更多全局设置。或者:
$ git config --global gc.pruneExpire 1.week.ago
这会将您的个人(用户全局)默认值设置为一周,而不是两周(但如果已设置,则会被特定于回购的“三天”设置覆盖)。
我在检查所有这些时注意到extensions.preciousObjects
没有记录。 (与所有配置变量一样,这可以拼写为任意大写和小写混合。)它是在Git 2.7.0中添加的,可以防止所有自动修剪对象,如果你想要的话您设置了一个共享存储库。 (使用起来很棘手,可能不是任何临时用户都应该设置的东西。)
答案 1 :(得分:1)
我不知道这是否是最好的,但是如果你 要输入git pull
,这是完全可以理解的,你可以使用一些shelling:
git-pull
。我在/usr/lib/git-core
例如。sh
脚本。添加if ( -f .git/gc.log)
以检测脚本末尾的问题。您可能需要重命名为git-pull-real
并创建一个简短的sh
脚本来包装它,并在之后调用if
。如果没有人提出内置的git解决方案,我认为这将是阻力最小的路径。