设置和配置
获取和创建项目
基本快照
分支和合并
共享和更新项目
检查和比较
补丁
调试
邮件
外部系统
服务器管理
指南
管理
管道命令
- 2.47.0 10/06/24
- 2.46.2 09/23/24
- 2.43.1 → 2.46.1 无更改
- 2.43.0 11/20/23
- 2.39.1 → 2.42.3 无更改
- 2.39.0 12/12/22
- 2.38.1 → 2.38.5 无更改
- 2.38.0 10/02/22
- 2.36.1 → 2.37.7 无更改
- 2.36.0 04/18/22
- 2.34.1 → 2.35.8 无更改
- 2.34.0 11/15/21
- 2.32.1 → 2.33.8 无更改
- 2.32.0 06/06/21
- 2.31.1 → 2.31.8 无更改
- 2.31.0 03/15/21
- 2.30.2 → 2.30.9 无更改
- 2.30.1 02/08/21
- 2.30.0 12/27/20
- 2.29.1 → 2.29.3 无更改
- 2.29.0 10/19/20
概要
git maintenance run [<options>] git maintenance start [--scheduler=<scheduler>] git maintenance (stop|register|unregister) [<options>]
描述
运行任务以优化 Git 仓库数据,从而加速其他 Git 命令并减少仓库的存储需求。
添加仓库数据的 Git 命令(例如 git add
或 git fetch
)针对响应式用户体验进行了优化。这些命令不会花费时间来优化 Git 数据,因为此类优化会随着整个仓库的大小而扩展,而这些用户命令每个都执行一个相对较小的操作。
git maintenance
命令提供了优化 Git 仓库的灵活性。
子命令
- run
-
运行一个或多个维护任务。如果指定了一个或多个
--task
选项,则按该顺序运行这些任务。否则,任务将由哪些maintenance.<task>.enabled
配置选项为真来确定。默认情况下,只有maintenance.gc.enabled
为真。 - start
-
开始对当前仓库运行维护。这执行与
register
子命令相同的配置更新,然后更新后台调度程序以每小时运行一次git maintenance run --scheduled
。 - stop
-
停止后台维护计划。当前仓库不会从维护仓库列表中删除,以防稍后重新启动后台维护。
- register
-
初始化 Git 配置值,以便任何计划的维护都将开始在该仓库上运行。这将仓库添加到当前用户的全局配置(或由 --config-file 选项指定的配置)中的
maintenance.repo
配置变量中,并为maintenance.<task>.schedule
启用一些推荐的配置值。启用的任务对于在后台运行而不会干扰前台进程是安全的。register
子命令还会将maintenance.strategy
配置值设置为incremental
,如果该值之前未设置。incremental
策略对每个维护任务使用以下时间表-
gc
: 禁用。 -
commit-graph
: 每小时。 -
prefetch
: 每小时。 -
loose-objects
: 每天。 -
incremental-repack
: 每天。
git maintenance register
还会通过在当前仓库中设置maintenance.auto = false
来禁用前台维护。此配置设置将在git maintenance unregister
命令后保留。 -
- unregister
-
从后台维护中删除当前仓库。这只会从配置列表中删除仓库。它不会停止后台维护进程运行。
如果当前仓库尚未注册,
unregister
子命令将报告错误。使用--force
选项即使在当前仓库未注册的情况下也能返回成功。
任务
- commit-graph
-
commit-graph
作业以增量方式更新commit-graph
文件,然后验证写入的数据是否正确。增量写入对于在并发的 Git 进程旁边运行是安全的,因为它不会过期先前commit-graph-chain
文件中的.graph
文件。它们将在稍后运行时根据过期延迟被删除。 - prefetch
-
prefetch
任务使用来自所有已注册远程的最新对象更新对象目录。对于每个远程,都会运行git fetch
命令。已配置的 refspec 被修改以将所有请求的 ref 放置在refs/prefetch/
中。此外,标签不会更新。这样做是为了避免干扰远程跟踪分支。最终用户期望这些 ref 保持不动,除非他们发起获取。但是,使用预取任务,完成后续实际获取所需的必要对象将已经获取,从而使实际获取更快。在理想情况下,它将只成为对许多远程跟踪分支的更新,而无需任何对象传输。
remote.<name>.skipFetchAll
配置可用于将特定远程排除在预取之外。 - gc
-
清理不必要的文件并优化本地仓库。“GC”代表“垃圾回收”,但此任务执行许多较小的任务。此任务对于大型仓库来说可能很昂贵,因为它会将所有 Git 对象重新打包到一个 pack 文件中。在某些情况下,它也可能具有破坏性,因为它会删除陈旧的数据。有关 Git 中垃圾回收的更多详细信息,请参阅 git-gc[1]。
- loose-objects
-
loose-objects
作业清理松散对象并将它们放入 pack 文件中。为了防止与并发 Git 命令出现竞争条件,它遵循两步过程。首先,它删除任何已存在于 pack 文件中的松散对象;并发 Git 进程将检查 pack 文件以获取对象数据,而不是松散对象。其次,它创建一个包含一批松散对象的新 pack 文件(以“loose-”开头)。批处理大小限制为 5 万个对象,以防止作业在具有许多松散对象的仓库上花费太长时间。gc
任务仅在未重新添加到 pack 文件时才将不可达对象写入为松散对象,以便稍后清理;因此,不建议同时启用loose-objects
和gc
任务。 - incremental-repack
-
incremental-repack
作业使用multi-pack-index
功能重新打包对象目录。为了防止与并发 Git 命令出现竞争条件,它遵循两步过程。首先,它调用git multi-pack-index expire
来删除multi-pack-index
文件未引用的 pack 文件。其次,它调用git multi-pack-index repack
来选择一些小的 pack 文件,并将它们重新打包成一个更大的 pack 文件,然后更新引用小 pack 文件的multi-pack-index
条目以引用新 pack 文件。这为在下次运行git multi-pack-index expire
时删除这些小的 pack 文件做好了准备。小 pack 文件的选择使得大 pack 文件的预期大小至少为批处理大小;有关 git-multi-pack-index[1] 中repack
子命令的--batch-size
选项,请参阅。默认批处理大小为零,这是一个特殊情况,它试图将所有 pack 文件重新打包成一个 pack 文件。 - pack-refs
-
pack-refs
任务收集松散的引用文件并将它们收集到一个文件中。这加快了需要遍历许多引用的操作。有关更多信息,请参阅 git-pack-refs[1]。
选项
- --auto
-
与
run
子命令结合使用时,仅在满足特定阈值时才运行维护任务。例如,gc
任务在松散对象的数量超过存储在gc.auto
配置设置中的数量时,或在 pack 文件的数量超过gc.autoPackLimit
配置设置时运行。与--schedule
选项不兼容。 - --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
子命令结合使用时,指定用于运行git maintenance run
的每小时、每天和每周执行的调度程序。<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 [email protected] [email protected] Fri 2021-04-30 00:00:00 CEST 5h 42min left Thu 2021-04-29 00:00:11 CEST 18h ago [email protected] [email protected] Mon 2021-05-03 00:00:00 CEST 3 days left Mon 2021-04-26 00:00:11 CEST 3 days ago [email protected] [email protected]
每个 --schedule=<frequency>
选项都注册一个计时器。
可以在以下文件中检查 systemd 单元的定义
~/.config/systemd/user/[email protected] ~/.config/systemd/user/[email protected] ~/.config/systemd/user/timers.target.wants/[email protected] ~/.config/systemd/user/timers.target.wants/[email protected] ~/.config/systemd/user/timers.target.wants/[email protected]
git maintenance start
将覆盖这些文件并使用 systemctl --user
重新启动计时器,因此任何自定义都应通过创建 drop-in 文件来完成,即 ~/.config/systemd/user/[email protected]
目录中以 .conf
为后缀的文件。
git maintenance stop
将停止用户 systemd 计时器并删除上述文件。
有关更多详细信息,请参见 systemd.timer(5)
。
macOS 系统上的后台维护
虽然 macOS 在技术上支持 cron
,但使用 crontab -e
需要提升的权限,并且执行的进程没有完整的用户上下文。没有完整的用户上下文,Git 及其凭证助手无法访问存储的凭证,因此某些维护任务无法正常工作。
相反,git maintenance start
与 launchctl
工具进行交互,这是在 macOS 中安排定时作业的推荐方法。通过 git maintenance (start|stop)
安排维护需要一些 launchctl
功能,这些功能仅在 macOS 10.11 或更高版本中可用。
您用户特定的计划任务存储为 ~/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
-
此布尔型配置选项控制某些命令是否在执行完其正常工作后运行
git maintenance run --auto
。默认为 true。 - maintenance.autoDetach
-
许多 Git 命令会在将数据写入存储库后触发自动维护。此布尔型配置选项控制这种自动维护是否应在前景中进行,或者维护进程是否应分离并在后台继续运行。
如果未设置,则使用
gc.autoDetach
的值作为后备。如果两者都未设置,则默认为 true,这意味着维护进程将分离。 - maintenance.strategy
-
此字符串配置选项提供了一种方法来指定后台维护的几个推荐计划之一。这只会影响在
git maintenance run --schedule=X
命令期间运行哪些任务,前提是未提供任何--task=<task>
参数。此外,如果设置了maintenance.<task>.schedule
配置值,则使用该值而不是maintenance.strategy
提供的值。可能的策略字符串是-
none
:此默认设置意味着任何计划都不会运行任何任务。 -
incremental
:此设置优化了执行不会删除任何数据的少量维护活动。这不会安排gc
任务,而是每小时运行prefetch
和commit-graph
任务,每天运行loose-objects
和incremental-repack
任务,每周运行pack-refs
任务。
-
- maintenance.<task>.enabled
-
此布尔型配置选项控制在未向
git maintenance run
指定--task
选项时是否运行名为<task>
的维护任务。如果存在--task
选项,则忽略这些配置值。默认情况下,只有maintenance.gc.enabled
为真。 - maintenance.<task>.schedule
-
此配置选项控制给定的
<task>
是否在git maintenance run --schedule=<frequency>
命令期间运行。该值必须是 "hourly"、"daily" 或 "weekly" 之一。 - maintenance.commit-graph.auto
-
此整型配置选项控制
commit-graph
任务在git maintenance run --auto
的一部分中运行的频率。如果为零,则commit-graph
任务不会使用--auto
选项运行。负值将强制任务每次运行。否则,正值意味着当不在 commit-graph 文件中的可到达提交数量至少为maintenance.commit-graph.auto
的值时,该命令应运行。默认值为 100。 - maintenance.loose-objects.auto
-
此整型配置选项控制
loose-objects
任务在git maintenance run --auto
的一部分中运行的频率。如果为零,则loose-objects
任务不会使用--auto
选项运行。负值将强制任务每次运行。否则,正值意味着当松散对象的数量至少为maintenance.loose-objects.auto
的值时,该命令应运行。默认值为 100。 - maintenance.incremental-repack.auto
-
此整型配置选项控制
incremental-repack
任务在git maintenance run --auto
的一部分中运行的频率。如果为零,则incremental-repack
任务不会使用--auto
选项运行。负值将强制任务每次运行。否则,正值意味着当不在多包索引中的打包文件数量至少为maintenance.incremental-repack.auto
的值时,该命令应运行。默认值为 10。
GIT
是 git[1] 套件的一部分