From: "Kristoffer Haugsbakk" <code@khaugsbakk.name>
To: "Sebastian Thiel" <sebastian.thiel@icloud.com>
Cc: "Josh Triplett" <josh@joshtriplett.org>, git@vger.kernel.org
Subject: Re: [RFC] Define "precious" attribute and support it in `git clean`
Date: Wed, 11 Oct 2023 23:41:26 +0200 [thread overview]
Message-ID: <b27782ce-8174-4d72-acc2-2d8f0e6e6ef1@app.fastmail.com> (raw)
In-Reply-To: <79901E6C-9839-4AB2-9360-9EBCA1AAE549@icloud.com>
On Tue, Oct 10, 2023, at 14:37, Sebastian Thiel wrote:
> [Note: I'm collaborating with Josh Triplett (CCed) on the design.]
>
> I'd like to propose adding a new standard gitattribute "precious". I've
> included proposed documentation at the end of this mail, and I'm happy to write
> the code. I wanted to get feedback on the concept first.
>
> What's a 'precious' file?
>
> "Precious" files are files that are specific to a user or local configuration
> and thus not tracked by Git. As such, a user spent time to create or generate
> them, and to tune them to fit their needs. They are typically also ignored by
> `git` due to `.gitignore` configuration, preventing them to be tracked by
> accident.
How do people deal with these precious files today?
You could track these precious files somewhere else. Maybe a Git directory
which is a sibling of `.git`.
.git-local
Files that are useless to the project but important to the individual.
It would get its own “excludes” file.
.gitignore-local
Now the normal repository (`.git`) needs to ignore these things.
# Cast a wide net: could want other siblings
# Use another pattern if you have something like `.git-blame-ignore-revs`
printf '.git-*\n' >> .git/info/exclude
printf '.gitignore-*\n' >> .git/info/exclude
You need to pass in two arguments to `git` every time you want to use
`.git-local`.
alias gitl='git --git-dir=.git-local -c core.excludesFile=.gitignore-local'
Git Local should ignore everything by default. You should check with
`.gitignore` to make sure that it ignores the files that Git Local does
_not_ ignore.
printf '*\n' >> .gitignore-local
printf '!.gitignore-local\n' >> .gitignore-local
printf '!.idea/**\n' >> .gitignore-local
Now you can backup your local files.
gitl add .gitignore-local
gitl add .idea
gitl commit -m'Update local'
But you can also version control them by providing real (intentional)
messages.
(Maybe `.idea/` is just an XML soup and thus hard to make a VCS narrative
around; I don't know yet.)
`git clean` won't help you. But an alias can.
Or if writing a shell-oneliner alias is too hard for you, I mean me.
#!/bin/sh
# git-klean
git --git-dir=.git-local -c core.excludesFile=.gitignore-local add --all
git --git-dir=.git-local -c core.excludesFile=.gitignore-local commit -mUpdate
git clean -e .gitignore-local -e .git-local "$@"
The two `-e` switches protect the Git Local things from being wiped by
`-xd` (tested with `--dry-run`).
§ Sibling repositories
At first I thought that `git clean` could use a `pre-clean` hook. But
that's not very satisfying.
Maybe Git could be told about its siblings via a multi-valued
configuration variable.
sibling=local
Then it expects there to exist `.git-<sibling name>` repository next to
it (`.git/../.git-<sibling name>`).
Then the rule becomes:
Only do destructive operations if all of the working trees[1] of the
sibling repositories are clean (cannot override with `--force`).
Additionally one could say that directories that are Git repositories
should be ignored by `git clean`, always.[2] Or siblings which
match the glob:
.git-*
... Or if you want something longer:
.git-sibling-*
(And also ignore `.gitignore-*` and maybe more things)
Then the regular Git repository might still blow away your precious
files. But they will be backed up by the siblings.
Or you put these other Git repositories outside of `.git/..`. Sidestepping
the issue at the cost of some path confusion (for yourself). Maybe at:
/home/user/git-siblings/repository1/local
† 1: Worktrees not considered.
† 2: And what would that break? People who make Git repositories in their
working trees and then delete them? (Well they can still use `rm -r`.)
⧫ ⧫
§ Worktrees
But seriously: worktrees probably makes this not work.
--
Kristoffer
prev parent reply other threads:[~2023-10-11 21:42 UTC|newest]
Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-10-10 12:37 [RFC] Define "precious" attribute and support it in `git clean` Sebastian Thiel
2023-10-10 13:38 ` Kristoffer Haugsbakk
2023-10-10 14:10 ` Josh Triplett
2023-10-10 17:07 ` Junio C Hamano
2023-10-12 8:47 ` Josh Triplett
2023-10-10 19:10 ` Kristoffer Haugsbakk
2023-10-12 9:04 ` Josh Triplett
2023-10-10 17:02 ` Junio C Hamano
2023-10-11 10:06 ` Richard Kerry
2023-10-11 22:40 ` Jeff King
2023-10-11 23:35 ` Junio C Hamano
2023-10-12 10:55 ` Sebastian Thiel
2023-10-12 16:58 ` Junio C Hamano
2023-10-13 9:09 ` Sebastian Thiel
2023-10-13 16:39 ` Junio C Hamano
2023-10-14 7:30 ` Sebastian Thiel
2023-10-13 10:06 ` Phillip Wood
2023-10-14 16:10 ` Junio C Hamano
2023-10-13 11:25 ` Oswald Buddenhagen
2023-10-14 5:59 ` Josh Triplett
2023-10-14 17:41 ` Junio C Hamano
2023-10-15 6:44 ` Elijah Newren
2023-10-15 7:33 ` Sebastian Thiel
2023-10-15 16:31 ` Junio C Hamano
2023-10-16 6:02 ` Sebastian Thiel
2023-10-23 7:15 ` Sebastian Thiel
2023-10-29 6:44 ` Elijah Newren
2023-10-11 21:41 ` Kristoffer Haugsbakk [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=b27782ce-8174-4d72-acc2-2d8f0e6e6ef1@app.fastmail.com \
--to=code@khaugsbakk.name \
--cc=git@vger.kernel.org \
--cc=josh@joshtriplett.org \
--cc=sebastian.thiel@icloud.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).