diff mbox series

[v4,2/4] maintenance: include 'cron' details in docs

Message ID 99170df4626544c1dc26d2e188b215a776140a32.1605647598.git.gitgitgadget@gmail.com (mailing list archive)
State Superseded
Headers show
Series Maintenance IV: Platform-specific background maintenance | expand

Commit Message

Derrick Stolee Nov. 17, 2020, 9:13 p.m. UTC
From: Derrick Stolee <dstolee@microsoft.com>

Advanced and expert users may want to know how 'git maintenance start'
schedules background maintenance in order to customize their own
schedules beyond what the maintenance.* config values allow. Start a new
set of sections in git-maintenance.txt that describe how 'cron' is used
to run these tasks.

This is particularly valuable for users who want to inspect what Git is
doing or for users who want to customize the schedule further. Having a
baseline can provide a way forward for users who have never worked with
cron schedules.

Helped-by: Eric Sunshine <sunshine@sunshineco.com>
Signed-off-by: Derrick Stolee <dstolee@microsoft.com>
---
 Documentation/git-maintenance.txt | 54 +++++++++++++++++++++++++++++++
 1 file changed, 54 insertions(+)

Comments

Eric Sunshine Nov. 18, 2020, 12:34 a.m. UTC | #1
On Tue, Nov 17, 2020 at 4:13 PM Derrick Stolee via GitGitGadget
<gitgitgadget@gmail.com> wrote:
> Advanced and expert users may want to know how 'git maintenance start'
> schedules background maintenance in order to customize their own
> schedules beyond what the maintenance.* config values allow. Start a new
> set of sections in git-maintenance.txt that describe how 'cron' is used
> to run these tasks.
>
> This is particularly valuable for users who want to inspect what Git is
> doing or for users who want to customize the schedule further. Having a
> baseline can provide a way forward for users who have never worked with
> cron schedules.
>
> Signed-off-by: Derrick Stolee <dstolee@microsoft.com>
> ---
> diff --git a/Documentation/git-maintenance.txt b/Documentation/git-maintenance.txt
> @@ -218,6 +218,60 @@ Further, the `git gc` command should not be combined with
> +The comments are used as a region to mark the schedule as written by Git.
> +Any modifications within this region will be completely deleted by
> +`git maintenance stop` or overwritten by `git maintenance start`.
> +
> +The `<path>` string is loaded to specifically use the location for the
> +`git` executable used in the `git maintenance start` command. This allows
> +for multiple versions to be compatible. However, if the same user runs
> +`git maintenance start` with multiple Git executables, then only the
> +latest executable will be used.

It looks like this section in v4 got accidentally reverted to the
wording from v2, whereas v3 had been changed to:

    The `crontab` entry specifies the full path of the `git`
    executable to ensure that the executed `git` command is the same
    one with which `git maintenance start` was issued independent of
    `PATH`. If the same user runs `git maintenance start` with
    multiple Git executables, then only the latest executable is used.

> +These commands use `git for-each-repo --config=maintenance.repo` to run
> +`git maintenance run --schedule=<frequency>` on each repository listed in
> +the multi-valued `maintenance.repo` config option. These are typically
> +loaded from the user-specific global config located at `~/.gitconfig`.
> +The `git maintenance` process then determines which maintenance tasks
> +are configured to run on each repository with each `<frequency>` using
> +the `maintenance.<task>.schedule` config options. These values are loaded
> +from the global or repository config values.

Same problem here. This wording is from v2, whereas v3 had been
changed to say generically "user-specific global config" rather than
mentioning `~/.gitconfig` explicitly.

> +If the config values are insufficient to achieve your desired background
> +maintenance schedule, then you can create your own schedule. If you run
> +`crontab -e`, then an editor will load with your user-specific `cron`
> +schedule. In that editor, you can add your own schedule lines. You could
> +start by adapting the default schedule listed earlier, or you could read
> +https://man7.org/linux/man-pages/man5/crontab.5.html[the `crontab` documentation]
> +for advanced scheduling techniques. Please do use the full path and
> +`--exec-path` techniques from the default schedule to ensure you are
> +executing the correct binaries in your schedule.

And here too. v3 had updated this to say only "crontab(5)" rather than
providing an explicit URL.
Derrick Stolee Nov. 18, 2020, 6:30 p.m. UTC | #2
On 11/17/2020 7:34 PM, Eric Sunshine wrote:
> On Tue, Nov 17, 2020 at 4:13 PM Derrick Stolee via GitGitGadget
> <gitgitgadget@gmail.com> wrote:
>> Advanced and expert users may want to know how 'git maintenance start'
>> schedules background maintenance in order to customize their own
>> schedules beyond what the maintenance.* config values allow. Start a new
>> set of sections in git-maintenance.txt that describe how 'cron' is used
>> to run these tasks.
>>
>> This is particularly valuable for users who want to inspect what Git is
>> doing or for users who want to customize the schedule further. Having a
>> baseline can provide a way forward for users who have never worked with
>> cron schedules.
>>
>> Signed-off-by: Derrick Stolee <dstolee@microsoft.com>
>> ---
>> diff --git a/Documentation/git-maintenance.txt b/Documentation/git-maintenance.txt
>> @@ -218,6 +218,60 @@ Further, the `git gc` command should not be combined with
>> +The comments are used as a region to mark the schedule as written by Git.
>> +Any modifications within this region will be completely deleted by
>> +`git maintenance stop` or overwritten by `git maintenance start`.
>> +
>> +The `<path>` string is loaded to specifically use the location for the
>> +`git` executable used in the `git maintenance start` command. This allows
>> +for multiple versions to be compatible. However, if the same user runs
>> +`git maintenance start` with multiple Git executables, then only the
>> +latest executable will be used.
> 
> It looks like this section in v4 got accidentally reverted to the
> wording from v2, whereas v3 had been changed to:> 
>     The `crontab` entry specifies the full path of the `git`
>     executable to ensure that the executed `git` command is the same
>     one with which `git maintenance start` was issued independent of
>     `PATH`. If the same user runs `git maintenance start` with
>     multiple Git executables, then only the latest executable is used.

Embarassing. Thanks for the catch.

Thanks,
-Stolee
diff mbox series

Patch

diff --git a/Documentation/git-maintenance.txt b/Documentation/git-maintenance.txt
index 6fec1eb8dc..4c7aac877d 100644
--- a/Documentation/git-maintenance.txt
+++ b/Documentation/git-maintenance.txt
@@ -218,6 +218,60 @@  Further, the `git gc` command should not be combined with
 but does not take the lock in the same way as `git maintenance run`. If
 possible, use `git maintenance run --task=gc` instead of `git gc`.
 
+The following sections describe the mechanisms put in place to run
+background maintenance by `git maintenance start` and how to customize
+them.
+
+BACKGROUND MAINTENANCE ON POSIX SYSTEMS
+---------------------------------------
+
+The standard mechanism for scheduling background tasks on POSIX systems
+is `cron`. This tool executes commands based on a given schedule. The
+current list of user-scheduled tasks can be found by running `crontab -l`.
+The schedule written by `git maintenance start` is similar to this:
+
+-----------------------------------------------------------------------
+# 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
+-----------------------------------------------------------------------
+
+The comments are used as a region to mark the schedule as written by Git.
+Any modifications within this region will be completely deleted by
+`git maintenance stop` or overwritten by `git maintenance start`.
+
+The `<path>` string is loaded to specifically use the location for the
+`git` executable used in the `git maintenance start` command. This allows
+for multiple versions to be compatible. However, if the same user runs
+`git maintenance start` with multiple Git executables, then only the
+latest executable will be used.
+
+These commands use `git for-each-repo --config=maintenance.repo` to run
+`git maintenance run --schedule=<frequency>` on each repository listed in
+the multi-valued `maintenance.repo` config option. These are typically
+loaded from the user-specific global config located at `~/.gitconfig`.
+The `git maintenance` process then determines which maintenance tasks
+are configured to run on each repository with each `<frequency>` using
+the `maintenance.<task>.schedule` config options. These values are loaded
+from the global or repository config values.
+
+If the config values are insufficient to achieve your desired background
+maintenance schedule, then you can create your own schedule. If you run
+`crontab -e`, then an editor will load with your user-specific `cron`
+schedule. In that editor, you can add your own schedule lines. You could
+start by adapting the default schedule listed earlier, or you could read
+https://man7.org/linux/man-pages/man5/crontab.5.html[the `crontab` documentation]
+for advanced scheduling techniques. Please do use the full path and
+`--exec-path` techniques from the default schedule to ensure you are
+executing the correct binaries in your schedule.
+
 
 GIT
 ---