FAQ¶
For teams that receive sync pull requests¶
I changed a managed file. Will the next sync revert it?
No. From that moment the file is local, and touchmark leaves it alone even when a pack
changes it later. To receive updates again, restore the pack version or run
touchmark apply --adopt <path>.
Our file looks the same as the pack's. Why is it local?
Most often it was committed with CRLF line endings and the pack's version has LF.
touchmark compares what the repository holds, the committed blob, so the line endings
count, on Windows checkouts too. Editing the text is not enough while the file keeps
CRLF: git commits CRLF again, even with core.autocrlf=true. Run
touchmark apply --adopt <path> and commit the result to take the pack's version.
How do I stop receiving a file?
Add it to ignore in .engineering-assets.yml. Deleting a managed file is not enough:
the next sync restores it.
We closed the sync pull request. Will it come back?
Not with the same content. A marker in the description records what the pull request
carried, and touchmark won't propose content you closed without merging. A new pull
request arrives when a pack changes those files, when you change packs or ignore in
.engineering-assets.yml, or when you make one of those files your own. Changed your
mind? Reopen the pull request, or tick Propose this content again in its description.
A pull request closed by a bot, such as a stale bot, doesn't count at first: touchmark
proposes it again after 30 days, then after 60; the third bot close counts as a decline.
Someone pushed a commit to the sync branch. What happens? touchmark stops updating the branch and says so in the pull request. Tick Rebuild this branch to let it start over; that drops the added commits. Update branch is fine: touchmark recognises a clean merge of the base branch. Merging any other branch into the sync branch pauses it too.
Who authors the commits? Are they signed? The hub's write account. touchmark signs with the bot's own key where one is set up, and on GitHub through the platform where a target requires signed commits. On GitLab, a target that rejects unsigned commits needs the writer's signing key; otherwise touchmark reports it as blocked.
Can we edit the title of a sync pull request? Yes. Once a person changes the title, labels or draft state, touchmark leaves them. The description is touchmark's: it rewrites it when the proposed changes change. Comment instead of editing it.
Can we get the changes without the pull request?
Run touchmark apply in a checkout with the hub next to it, and commit the result: see
Use it on your machine. The open sync pull request then has nothing left to
propose and is closed as no-diff.
How do we leave entirely?
Put enabled: false in .engineering-assets.yml, or delete the file. touchmark closes
its open pull request as opted-out and delivers nothing more. Files already merged
stay. If the hub subscribed your repository (the sync pull request says so), deleting
the file is not enough: the hub's subscription applies again, so add the file with
enabled: false.
We never added an opt-in file. Why did we get a sync pull request?
The hub subscribed your repository (opt_in: assumed in its targets.yml), and the
pull request's description says so. Treat it like any other: merge it, or close it and
the same content won't come back. To choose packs or keep files, add
.engineering-assets.yml with packs or ignore; to stop them, add it with
enabled: false.
For hub maintainers¶
Why did touchmark skip some of our repositories?
A public hub's CI logs are public, so touchmark skips private and internal targets there
and prints only how many. A hub whose visibility the CI does not report counts as public.
Set security.private_targets_in_public_hub: deliver to deliver to them anyway; their
names will then appear in the logs. Repositories without the opt-in file are skipped too
(not-opted-in), unless an entry that selects them has opt_in: assumed, and so are
repositories whose opt-in file says enabled: false (opted-out).
Can the hub subscribe repositories without asking each team?
Yes: opt_in: assumed on an entry of targets.yml, or in defaults. The repositories it
selects get their packs without an opt-in file, and the first sync pull request tells the
team how to choose packs or opt out. Narrow an organisation with match (acme/svc-*)
and leave repositories out with exclude patterns (corp:platform/legacy/**). See
targets.yml.
Can targets.yml name a repository by its URL?
Yes: repo: https://gitlab.example.com/platform/api works, and so do org, group and
exclude. touchmark finds the provider in hub.yml whose url the URL lies under and
reports the target as <provider>:<path>. check fails on a URL no provider serves.
Can two packs ship the same path? Yes. Packs are layered in order, and the later one wins.
We renamed a pack. Do the files stay managed?
Yes, if the new pack lists its old name under formerly in hub.yml: the old name's
history keeps proving ownership. A pack the hub no longer assigns to a repository leaves
its files there; status lists them as orphaned.
Why does the hub need its full git history?
The history is the ownership record: touchmark recognises older versions by reading every
commit that touched packs/. On a shallow clone, managed files would look local, so
touchmark refuses to run on one. It refuses a partial clone (--filter) too, which would
fetch every old version one at a time.
What if the hub has a mistake?
status and apply run the same checks as touchmark check and refuse a hub that fails
them, with nothing written. A wrong formerly, for example, could otherwise make a
pack's files look retired. In CI, plan on the hub's pull request shows every target's
outcome before anything is merged.
Does touchmark run anything from my repositories? No. It reads and writes files and calls git. It never executes scripts or hooks from the hub or from the targets. In the hub's CI it never checks your repository out.
Why two accounts? The read key reaches every branch of the hub: anyone who can push a branch can use it. The write key must not. A separate reader also has its own rate limits, and on GitLab a role belongs to the user, not to the token. See the security model.
How many writes does a rollout cost?
plan prints it: writes per provider, the time the provider's limits give them, and the
number of runs. As an order of magnitude, a first rollout to 500 GitHub targets is about
2000 writes and four hours on the git path, in five runs with the default
max_new_prs_per_run: 100.
How do we upgrade touchmark?
Read the release notes, then merge the Dependabot (the Action) or Renovate (the image)
pull request. Dependabot's plan gets no secrets and shows the hub's side only: run
plan with the read key yourself before you merge. Renovate waits for your approval on
its Dependency Dashboard for the touchmark image.
How it compares¶
| touchmark | Copier update |
repo-file-sync-action | rulesync, ruler | |
|---|---|---|---|---|
| Scope | many repositories from one hub | one repository from one template | many repositories from one repository | agent formats inside one repository |
| A file the repository changed | kept; it becomes the repository's own | three-way merge, conflicts land in the pull request | overwritten, or never touched again | regenerated |
| State in the target | none | .copier-answers.yml |
none | a source directory |
| Platforms | GitHub, GitLab, Gitea, Forgejo; several at once from one hub | any (runs locally) | GitHub | any (runs locally) |