On 12/10/2023 17:58, Junio C Hamano wrote:
Sebastian Thiel <sebastian.thiel@xxxxxxxxxx> writes:
Sebastian - thanks for raising this again, it would be really good to
get a solution for handling "ignored but not expendable" files
I have been regretting that I did not make the quoting syntax not
obviously extensible in f87f9497 (git-ls-files: --exclude mechanism
updates., 2005-07-24), which technically was a breaking change (as a
relative pathname that began with '!' were not special, but after
the change, it became necessary to '\'-quote it). A relative
pathname that begins with '$' would be now broken the same way, but
hopefully the fallout would be minor. I presume you picked '$'
exactly because of this reason?
I do not think it will be the end of the world if we don't do so,
but it would be really really nice if we at least explored a way (or
two) to make a big enough hole in the syntax to not just add
"precious", but leave room to later add other traits, without having
to worry about breaking the backward compatibility again. A
simplest and suboptimal way may be to declare that a path that
begins with '$' now needs '\'-quoting (just like your proposal),
reserve '$$' as the precious prefix, and '$' followed by any other
byte reserved for future use, but there may be better ideas.
One thought I had was that we could abuse the comment syntax to annotate
paths something like
#(keep)
/my-precious-file
would prevent /my-precious-file from being deleted by git clean (and
hopefully unpack-trees()[1]). It means that older versions of git would
treat the file as ignored. If we ever want more than one annotation per
path we could separate them with commas
#(keep,something-else)
/my-file
Strictly speaking it is a backward incompatible change but I doubt there
are many people using comments like that. I also wondered about some
kind of suffix on the file
/my-precious-file #(keep)
but that means that older versions of git would not ignore the file.
Best Wishes
Phillip
[1] Of the cases listed in [2] it is "git checkout" and friends
overwriting ignored files that I worry about more. At least "git clean"
defaults to a dry-run and has in interactive mode to select what gets
deleted.
[2] https://lore.kernel.org/git/xmqqttqytnqb.fsf@gitster.g