设置和配置
获取和创建项目
基本快照
分支与合并
共享和更新项目
检查和比较
打补丁
调试
电子邮件
外部系统
服务器管理
指南
管理
底层命令
-
2.53.0
2026-02-02
-
2.52.0
2025-11-17
- 2.50.1 → 2.51.2 无更改
-
2.50.0
2025-06-16
- 2.47.2 → 2.49.1 无变更
-
2.47.1
2024-11-25
-
2.47.0
2024-10-06
- 2.46.3 → 2.46.4 无变更
-
2.46.2
2024-09-23
- 2.43.1 → 2.46.1 无变更
-
2.43.0
2023-11-20
- 2.39.1 → 2.42.4 无更改
-
2.39.0
2022-12-12
- 2.38.1 → 2.38.5 无更改
-
2.38.0
2022-10-02
- 2.36.1 → 2.37.7 无更改
-
2.36.0
2022-04-18
- 2.34.1 → 2.35.8 无更改
-
2.34.0
2021-11-15
- 2.32.1 → 2.33.8 无更改
-
2.32.0
2021-06-06
- 2.31.1 → 2.31.8 无更改
-
2.31.0
2021-03-15
- 2.30.2 → 2.30.9 无变化
-
2.30.1
2021-02-08
-
2.30.0
2020-12-27
- 2.29.1 → 2.29.3 无更改
-
2.29.0
2020-10-19
概要
git maintenance run [<options>] git maintenance start [--scheduler=<scheduler>] git maintenance (stop|register|unregister) [<options>] git maintenance is-needed [<options>]
描述
运行任务以优化 Git 仓库数据,加速其他 Git 命令并减少仓库的存储需求。
添加仓库数据的 Git 命令(如 git add 或 git fetch)针对响应式用户体验进行了优化。这些命令不会花费时间来优化 Git 数据,因为此类优化随仓库的完整大小而缩放,而这些用户命令各执行一个相对较小的操作。
git maintenance 命令为如何优化 Git 仓库提供了灵活性。
子命令
- run
-
运行一个或多个维护任务。如果指定了一个或多个
--task选项,则按该顺序运行这些任务。否则,任务由哪些maintenance.<task>.enabled配置选项为 true 决定。默认情况下,只有maintenance.gc.enabled为 true。 - start
-
开始在当前仓库上运行维护。这执行与
register子命令相同的配置更新,然后更新后台调度程序以每小时运行一次gitmaintenancerun--scheduled。 - stop
-
停止后台维护计划。当前仓库不会从受维护仓库列表中移除,以防以后重新启动后台维护。
- register
-
初始化 Git 配置值,以便任何计划的维护都将开始在此仓库上运行。这会将仓库添加到当前用户全局配置中的
maintenance.repo配置变量中,或由 --config-file 选项指定的配置中,并启用一些推荐的maintenance.<task>.schedule配置值。启用的任务可以在后台运行而不会干扰前台进程。register子命令还会将maintenance.strategy配置值设置为incremental(如果之前未设置此值)。incremental策略为每个维护任务使用以下计划:-
gc:已禁用。 -
commit-graph:每小时。 -
prefetch:每小时。 -
loose-objects:每天。 -
incremental-repack:每天。
gitmaintenanceregister还会通过在当前仓库中设置maintenance.auto=false来禁用前台维护。此配置设置在执行gitmaintenanceunregister命令后仍将保留。 -
- unregister
-
从后台维护中移除当前仓库。这仅从配置列表中移除仓库,并不会停止后台维护进程的运行。
如果当前仓库尚未注册,
unregister子命令将报告错误。使用--force选项即使在当前仓库未注册时也返回成功。 - is-needed
-
检查是否需要运行维护,而不实际运行它。如果需要运行维护,则以状态码 0 退出,否则为 1。理想情况下与 --auto 标志配合使用。
如果指定了一个或多个
--task选项,则按该顺序检查这些任务。否则,任务由哪些maintenance.<task>.enabled配置选项为 true 决定。默认情况下,只有maintenance.gc.enabled为 true。
任务
- commit-graph
-
commit-graph任务增量更新commit-graph文件,然后验证写入的数据是否正确。增量写入可以安全地与并发 Git 进程一起运行,因为它不会使上一个commit-graph-chain文件中的.graph文件失效。它们将由稍后的运行根据过期延迟被删除。 - prefetch
-
prefetch任务使用所有已注册远程仓库中的最新对象更新对象目录。对于每个远程仓库,都会运行一个gitfetch命令。配置的 refspec 被修改为将所有请求的引用放置在refs/prefetch/中。此外,标签不会更新。这样做是为了避免干扰远程跟踪分支。最终用户期望这些引用除非他们启动获取,否则保持不动。然而,通过预取任务,完成稍后实际获取所需的物件已经获得,从而使实际获取更快。在理想情况下,它将变成对一堆远程跟踪分支的更新,而没有任何对象传输。
remote.<name>.skipFetchAll配置可用于排除特定远程仓库的预取。 - gc
-
清理不必要的文件并优化本地仓库。“GC”代表“垃圾回收”,但此任务执行许多较小的任务。对于大型仓库,此任务可能非常昂贵,因为它将所有 Git 对象重新打包到一个包文件中。在某些情况下,它也可能具有破坏性,因为它会删除陈旧数据。有关 Git 中垃圾回收的更多详细信息,请参阅 git-gc[1]。
- loose-objects
-
loose-objects任务清理松散对象并将其放入包文件中。为了防止与并发 Git 命令发生竞态条件,它遵循一个两步过程。首先,它删除已存在于包文件中的任何松散对象;并发 Git 进程将检查包文件中的对象数据,而不是松散对象。其次,它创建一个包含一批松散对象的新包文件(以“loose-”开头)。批量大小默认为五万个对象,以防止该任务在具有许多松散对象的仓库上耗时过长。使用
maintenance.loose-objects.batchSize配置选项来调整此大小,包括使用值0来取消限制。gc任务将不可达对象写入为松散对象,以便仅在未重新添加到包文件时由稍后的步骤清理;出于这个原因,不建议同时启用loose-objects和gc任务。 - incremental-repack
-
incremental-repack任务使用multi-pack-index功能重新打包对象目录。为了防止与并发 Git 命令发生竞态条件,它遵循一个两步过程。首先,它调用gitmulti-pack-indexexpire来删除multi-pack-index文件未引用的包文件。其次,它调用gitmulti-pack-indexrepack来选择几个小包文件并将它们重新打包成一个较大的包文件,然后更新引用小包文件的multi-pack-index条目以引用新的包文件。这为下次运行gitmulti-pack-indexexpire时删除这些小包文件做好了准备。选择小包文件的原则是使大包文件的预期大小至少为批量大小;参见 git-multi-pack-index[1] 中repack子命令的--batch-size选项。默认批量大小为零,这是一种尝试将所有包文件重新打包成单个包文件的特殊情况。 - pack-refs
-
pack-refs任务收集松散的引用文件并将它们收集到单个文件中。这可以加速需要遍历许多引用的操作。有关更多信息,请参阅 git-pack-refs[1]。 - reflog-expire
-
reflog-expire任务删除 reflog 中早于过期阈值的任何条目。有关更多信息,请参阅 git-reflog[1]。 - rerere-gc
-
rerere-gc任务对 rerere 缓存中的陈旧条目执行垃圾回收。有关更多信息,请参阅 git-rerere[1]。 - worktree-prune
-
worktree-prune任务删除陈旧或损坏的工作树。有关更多信息,请参阅 git-worktree[1]。
选项
- --auto
-
与
run子命令结合使用时,仅在满足某些阈值时才运行维护任务。例如,当松散对象的数量超过gc.auto配置设置中存储的数量时,或者当包文件的数量超过gc.autoPackLimit配置设置时,将运行gc任务。与--schedule选项不兼容。与is-needed子命令结合使用时,检查是否满足所需阈值而不实际运行维护。 - --schedule
-
与
run子命令结合使用时,仅在满足某些时间条件时才运行维护任务,如每个 <task> 的maintenance.<task>.schedule配置值所指定。此配置值指定了自上次运行该任务以来的秒数,具体根据maintenance.<task>.lastRun配置值确定。被测试的任务是那些由--task=<task> 选项提供的任务,或那些maintenance.<task>.enabled设置为 true 的任务。 - --quiet
-
不通过
stderr报告进度或其他信息。 - --task=<task>
-
如果指定了一次或多次此选项,则仅按指定的顺序运行指定的任务。如果未指定
--task=<task> 参数,则仅考虑maintenance.<task>.enabled配置为true的任务。有关接受的 <task> 值列表,请参阅“任务”部分。 - --scheduler=auto|crontab|systemd-timer|launchctl|schtasks
-
与
start子命令结合使用时,指定运行每小时、每天和每周执行gitmaintenancerun的调度程序。<scheduler> 的可能值有auto、crontab(POSIX)、systemd-timer(Linux)、launchctl(macOS) 和schtasks(Windows)。当指定auto时,使用适当的特定于平台的调度程序;在 Linux 上,如果可用则使用systemd-timer,否则使用crontab。默认值为auto。
故障排除
git maintenance 命令旨在简化仓库维护模式,同时尽量减少 Git 命令期间的用户等待时间。有多种配置选项可用于自定义此过程。默认维护选项侧重于快速完成的操作,即使在大型仓库上也是如此。
用户可能会发现某些情况下计划的维护任务未按预期频率运行。每个 git maintenance run 命令都会在仓库的对象数据库上获取一把锁,这可以防止其他并发的 git maintenance run 命令在同一个仓库上运行。如果没有这种保障措施,竞争进程可能会使仓库处于不可预测的状态。
后台维护计划每小时运行一次 git maintenance run 进程。每次运行执行“每小时”任务。在午夜,该进程还会执行“每天”任务。在每周第一天的午夜,该进程还会执行“每周”任务。单个进程迭代每个已注册的仓库,按照该频率执行计划任务。进程计划在每位客户端每小时的一个随机分钟运行,以分散多个客户端可能产生的负载(例如来自预取的负载)。根据已注册仓库的数量及其大小,此过程可能需要超过一个小时。在这种情况下,多个 git maintenance run 命令可能同时在同一个仓库上运行,在对象数据库锁上发生冲突。这导致两个任务中的一个无法运行。
如果您发现某些维护窗口需要超过一小时才能完成,请考虑降低维护任务的复杂性。例如,gc 任务比 incremental-repack 任务慢得多。然而,这是以对象数据库略大为代价的。考虑将更昂贵的任务移至运行频率较低的计划中。
专家级用户可能会考虑使用不同于通过 git maintenance start 和 Git 配置选项可用的计划来安排自己的维护任务。这些用户应注意对象数据库锁以及并发 git maintenance run 命令的行为方式。此外,git gc 命令不应与 git maintenance run 命令结合使用。git gc 修改对象数据库,但不以与 git maintenance run 相同的方式获取锁。如果可能,请使用 git maintenance run --task=gc 而不是 git gc。
以下各节描述了由 git maintenance start 建立的用于运行后台维护的机制以及如何自定义它们。
POSIX 系统上的后台维护
在 POSIX 系统上安排后台任务的标准机制是 cron(8)。此工具根据给定的计划执行命令。可以通过运行 crontab -l 找到当前的用户计划任务列表。由 git maintenance start 写入的计划类似于这样:
# BEGIN GIT MAINTENANCE SCHEDULE # The following schedule was created by Git # Any edits made in this region might be # replaced in the future by a Git command. 0 1-23 * * * "/<path>/git" --exec-path="/<path>" for-each-repo --config=maintenance.repo maintenance run --schedule=hourly 0 0 * * 1-6 "/<path>/git" --exec-path="/<path>" for-each-repo --config=maintenance.repo maintenance run --schedule=daily 0 0 * * 0 "/<path>/git" --exec-path="/<path>" for-each-repo --config=maintenance.repo maintenance run --schedule=weekly # END GIT MAINTENANCE SCHEDULE
注释用作标记 Git 写入的计划区域。此区域内的任何修改都将被 git maintenance stop 完全删除或被 git maintenance start 覆盖。
crontab 条目指定了 git 可执行文件的完整路径,以确保执行的 git 命令与发出 git maintenance start 的命令相同,且不受 PATH 影响。如果同一个用户使用多个 Git 可执行文件运行 git maintenance start,则仅使用最新的可执行文件。
这些命令使用 git for-each-repo --config=maintenance.repo 在多值 maintenance.repo 配置选项中列出的每个仓库上运行 git maintenance run --schedule=<frequency>。这些通常从用户特定的全局配置中加载。然后,git maintenance 进程使用 maintenance.<task>.schedule 配置选项确定每个仓库在每个 <frequency> 下配置运行哪些维护任务。这些值从全局或仓库配置值中加载。
如果配置值不足以实现您想要的后台维护计划,您可以创建自己的计划。如果您运行 crontab -e,则将加载一个编辑器,其中包含您的用户特定 cron 计划。在该编辑器中,您可以添加自己的计划行。您可以从调整前面列出的默认计划开始,也可以阅读 crontab(5) 文档以了解高级计划技术。请务必使用默认计划中的全路径和 --exec-path 技术,以确保在计划中执行正确的二进制文件。
LINUX SYSTEMD 系统上的后台维护
虽然 Linux 支持 cron,但取决于发行版,cron 可能是一个非必装的可选包。在现代 Linux 发行版上,systemd 定时器正在取代它。
如果用户 systemd 定时器可用,它们将被用作 cron 的替代品。
在这种情况下,git maintenance start 将创建用户 systemd 定时器单元并启动定时器。可以通过运行 systemctl --user list-timers 找到当前的用户计划任务列表。由 git maintenance start 写入的定时器类似于这样:
$ systemctl --user list-timers NEXT LEFT LAST PASSED UNIT ACTIVATES Thu 2021-04-29 19:00:00 CEST 42min left Thu 2021-04-29 18:00:11 CEST 17min ago git-maintenance@hourly.timer git-maintenance@hourly.service Fri 2021-04-30 00:00:00 CEST 5h 42min left Thu 2021-04-29 00:00:11 CEST 18h ago git-maintenance@daily.timer git-maintenance@daily.service Mon 2021-05-03 00:00:00 CEST 3 days left Mon 2021-04-26 00:00:11 CEST 3 days ago git-maintenance@weekly.timer git-maintenance@weekly.service
为每个 --schedule=<frequency> 选项注册一个定时器。
可以在以下文件中检查 systemd 单元的定义:
~/.config/systemd/user/git-maintenance@.timer ~/.config/systemd/user/git-maintenance@.service ~/.config/systemd/user/timers.target.wants/git-maintenance@hourly.timer ~/.config/systemd/user/timers.target.wants/git-maintenance@daily.timer ~/.config/systemd/user/timers.target.wants/git-maintenance@weekly.timer
git maintenance start 将覆盖这些文件并使用 systemctl --user 重新启动定时器,因此任何自定义都应通过创建 drop-in 文件来完成,即在 ~/.config/systemd/user/git-maintenance@.service.d 目录中创建一个以 .conf 为后缀的文件。
git maintenance stop 将停止用户 systemd 定时器并删除上述文件。
有关更多详细信息,请参阅 systemd.timer(5)。
MACOS 系统上的后台维护
虽然 macOS 在技术上支持 cron,但使用 crontab -e 需要提升权限,且执行的进程没有完整的用户上下文。没有完整的用户上下文,Git 及其凭据辅助程序无法访问存储的凭据,因此某些维护任务无法正常运行。
相反,git maintenance start 与 launchctl 工具交互,这是 macOS 中安排定时任务的推荐方式。通过 git maintenance (start|stop) 安排维护需要某些仅在 macOS 10.11 或更高版本中可用的 launchctl 功能。
您的用户特定计划任务存储为 ~/Library/LaunchAgents/ 中的 XML 格式 .plist 文件。您可以使用以下命令查看当前注册的任务:
$ ls ~/Library/LaunchAgents/org.git-scm.git* org.git-scm.git.daily.plist org.git-scm.git.hourly.plist org.git-scm.git.weekly.plist
为每个 --schedule=<frequency> 选项注册一个任务。要检查 XML 格式如何描述每个计划,请在编辑器中打开其中一个 .plist 文件,并检查 <key>StartCalendarInterval</key> 元素后的 <array> 元素。
git maintenance start 将覆盖这些文件并使用 launchctl 重新注册任务,因此任何自定义都应通过创建具有不同名称的您自己的 .plist 文件来完成。类似地,git maintenance stop 命令将向 launchctl 注销任务并删除 .plist 文件。
要对后台任务进行更高级的自定义,请参阅 launchctl.plist(5) 以获取更多信息。
WINDOWS 系统上的后台维护
Windows 不支持 cron,而是拥有自己的安排后台任务系统。git maintenance start 命令使用 schtasks 命令将任务提交给此系统。您可以使用“任务计划程序”应用程序检查所有后台任务。Git 添加的任务名称形式为 Git Maintenance (<frequency>)。任务计划程序 GUI 有检查这些任务的方法,但您也可以将任务导出到 XML 文件并在其中查看详细信息。
请注意,由于 Git 是一个控制台应用程序,这些后台任务会创建一个当前用户可见的控制台窗口。可以通过在任务计划程序中选择“不管用户是否登录都要运行”选项来手动更改此设置。此更改需要输入密码,这就是 git maintenance start 默认不选择它的原因。
如果您想自定义后台任务,请重命名任务,以便将来的 git maintenance (start|stop) 调用不会覆盖您的自定义任务。
配置
本节中以下所有内容均从 git-config[1] 文档中选择性地包含。内容与彼处相同:
- maintenance.auto
-
此布尔配置选项控制某些命令在完成正常工作后是否运行
gitmaintenancerun--auto。默认为 true。 - maintenance.autoDetach
-
许多 Git 命令在向仓库写入数据后会触发自动维护。此布尔配置选项控制此自动维护是在前台发生,还是维护进程应脱离并在后台继续运行。
如果未设置,则使用
gc.autoDetach的值作为备选。如果两者都未设置,则默认为 true,这意味着维护进程将脱离运行。 - maintenance.strategy
-
此字符串配置选项提供了一种方法来指定几种推荐的仓库维护策略之一。这会影响在
gitmaintenancerun期间运行哪些任务(假设未提供--task=<task> 参数)。此设置会影响手动维护、自动维护以及计划维护。根据维护类型的不同,运行的任务可能不同。可以通过设置
maintenance.<task>.enabled和maintenance.<task>.schedule来进一步调整维护策略。如果设置了这些值,则使用这些值而不是maintenance.strategy提供的默认值。可能的策略有:
-
none:此策略意味着完全不运行任何任务。这是计划维护的默认策略。 -
gc:此策略运行gc任务。这是手动维护的默认策略。 -
geometric:此策略执行包文件的几何重新打包,并保持辅助数据结构最新。该策略会使 reflog 中的数据过期并移除无法再定位的工作树。当几何重新打包策略决定执行“全合一”重新打包时,该策略会为所有不可达对象生成一个废弃包(cruft pack)。已经是废弃包一部分的对象将过期。这种重新打包策略是
gc策略的完全替代方案,建议用于大型仓库。 -
incremental:此设置针对执行不删除任何数据的小型维护活动进行了优化。这不安排gc任务,而是每小时运行prefetch和commit-graph任务,每天运行loose-objects和incremental-repack任务,每周运行pack-refs任务。手动仓库维护使用gc任务。
-
- maintenance.<task>.enabled
-
此布尔配置选项控制当没有为
gitmaintenancerun指定--task选项时,是否运行名为 <task> 的维护任务。如果存在--task选项,则忽略这些配置值。默认情况下,只有maintenance.gc.enabled为 true。 - maintenance.<task>.schedule
-
此配置选项控制给定的 <task> 是否在
gitmaintenancerun--schedule=<frequency> 命令期间运行。值必须是 "hourly"、"daily" 或 "weekly" 之一。 - maintenance.commit-graph.auto
-
此整数配置选项控制
commit-graph任务作为gitmaintenancerun--auto的一部分运行的频率。如果为零,则commit-graph任务将不会随--auto选项运行。负值将强制任务每次都运行。否则,正值意味着当不在 commit-graph 文件中的可达提交数量至少为maintenance.commit-graph.auto的值时,应运行该命令。默认值为 100。 - maintenance.loose-objects.auto
-
此整数配置选项控制
loose-objects任务作为gitmaintenancerun--auto的一部分运行的频率。如果为零,则loose-objects任务将不会随--auto选项运行。负值将强制任务每次都运行。否则,正值意味着当松散对象的数量至少为maintenance.loose-objects.auto的值时,应运行该命令。默认值为 100。 - maintenance.loose-objects.batchSize
-
此整数配置选项控制在
loose-objects任务期间写入包文件的最大松散对象数。默认值为五万。使用值0表示没有限制。 - maintenance.incremental-repack.auto
-
此整数配置选项控制
incremental-repack任务作为gitmaintenancerun--auto的一部分运行的频率。如果为零,则incremental-repack任务将不会随--auto选项运行。负值将强制任务每次都运行。否则,正值意味着当不在 multi-pack-index 中的包文件数量至少为maintenance.incremental-repack.auto的值时,应运行该命令。默认值为 10。 - maintenance.geometric-repack.auto
-
此整数配置选项控制
geometric-repack任务作为gitmaintenancerun--auto的一部分运行的频率。如果为零,则geometric-repack任务将不会随--auto选项运行。负值将强制任务每次都运行。否则,正值意味着当存在需要合并在一起以保持几何级数增长的包文件,或者当至少有这么多将被写入新包文件的松散对象时,该命令应运行。默认值为 100。 - maintenance.geometric-repack.splitFactor
-
此整数配置选项控制用于几何序列的因子。有关更多详细信息,请参阅 git-repack[1] 中的
--geometric=选项。默认为2。 - maintenance.reflog-expire.auto
-
此整数配置选项控制
reflog-expire任务作为gitmaintenancerun--auto的一部分运行的频率。如果为零,则reflog-expire任务将不会随--auto选项运行。负值将强制任务每次都运行。否则,正值意味着当 "HEAD" reflog 中过期的 reflog 条目数量至少为maintenance.loose-objects.auto的值时,该命令应运行。默认值为 100。 - maintenance.rerere-gc.auto
-
此整数配置选项控制
rerere-gc任务作为gitmaintenancerun--auto的一部分运行的频率。如果为零,则rerere-gc任务将不会随--auto选项运行。负值将强制任务每次都运行。否则,任何正值都意味着当 "rr-cache" 目录存在且至少有一个条目时,无论其是否陈旧,命令都将运行。这种启发式方法将来可能会完善。默认值为 1。 - maintenance.worktree-prune.auto
-
此整数配置选项控制
worktree-prune任务作为gitmaintenancerun--auto的一部分运行的频率。如果为零,则worktree-prune任务将不会随--auto选项运行。负值将强制任务每次都运行。否则,正值意味着当可修剪的工作树数量超过该值时,命令应运行。默认值为 1。