From: Alejandro Colomar <alx+git@kernel.org>
To: Junio C Hamano <gitster@pobox.com>
Cc: Ben Knoble <ben.knoble@gmail.com>,
git@vger.kernel.org, Andy Shevchenko <andy@kernel.org>,
Linus Torvalds <torvalds@linux-foundation.org>,
Krzysztof Kozlowski <krzk@kernel.org>
Subject: Re: git-ls-files(1) avoiding symlinks
Date: Fri, 6 Nov 2026 22:06:38 +0100 [thread overview]
Message-ID: <au49oFqexVxPUm-2@debian> (raw)
In-Reply-To: <xmqqeccxhg0f.fsf@gitster.g>
[-- Attachment #1: Type: text/plain, Size: 3284 bytes --]
Hi Junio,
> Date: 2026-11-06 12:16:48-0800
> From: Junio C Hamano <gitster@pobox.com>
>
> Alejandro Colomar <alx+git@kernel.org> writes:
>
> >> > With -z it becomes a bit tedious:
> >> >
> >> > $ git ls-files -z --format='%(objectmode) %(path)' \
> >> > | grep -zv ^120000 \
> >> > | sed -z 's/^.* //' \
> >> > | grep -z '\.[ch]$' \
> >> > | xargs -0 grepc creat;
>
> Shouldn't the grep|sed|grep be doable with a single sed invocation?
>
> >> > I expect git-ls-files(1) could make this much simpler, though:
> >> >
> >> > $ git ls-files --type f \
> >> > | grep '\.[ch]$' \
> >> > | xargs grepc creat;
>
> Not really. Why is "--type" have to be so special? What would the
> next person ask for? --size?
Indeed. While looking at the implementation of git-ls-files(1), I
realized it wasn't easy to decide how to implement this, as it has other
types (objecttype, which is blob/commit/...). I thought perhaps
--objectmode, but then I'm not inderested in searching specific modes,
but rather filtering out some. Perhaps in this case it's more
appropriate to have my own local command 'git-find' that does what
I want.
I've ended up doing this, and now don't think a flag in git-ls-files(1)
would make much sense.
$ cat $(which git-find)
#!/bin/bash
# Copyright 2026, Alejandro Colomar <alx@kernel.org>
# SPDX-License-Identifier: GPL-3.0-or-later
set -Eeufo pipefail;
git ls-files --format='%(objectmode) %(path)' \
| grep -v '^120000' \
| sed 's/^.* //';
And will eventually add a -z flag for this command when I find I need
it.
> The "ls-files" plumbing command is designed as a component to build
> your own pipeline with. Don't throw in random unrelated features to
> it. In the longer run, it is not a good substitute for improving
> the skill to construct a good pipeline.
Indeed.
> Learn the tools available to you that you already have heard of, so
> that you can make better uses of them (in this case "sed"). If you
> squash the grep|sed|grep pipeline into a single sed
>
> git ls-files -z -s "*.[ch]" |
> sed -z -n -e '/^120000/d' -e '/^.* 0 /s///p' |
> xargs -r -0 ls -ld
>
> the result does not look too bad.
I find it simpler to have a simple grep -v rejecting the lines I don't
want, and then sed(1) getting rid of the stuff. The command above seems
interesting for performance, but compared to the tool using the file
names, that's probably negligible.
About git-ls-files(1)'s -s, I think it's easier to parse with the
%(objectmode) in the format, as I don't need all the other information
printed by -s.
>
> One unrelated tip for better readability is to end, not begin, your
> lines with the "|" pipe characters. That way you do not have to
> sprinkle so many unsightly backslashes ;-).
I like to have them at the front of the line because it shows more
clearly whether I'm piping a command or starting a new pipeline. I got
used to the backslashes. After all, the first few characters of a line
are all aligned, and the most significant ones. Stuff to the right I
tend to ignore it as noise. :)
>
> HTH.
Yup! Thanks!
Have a lovely night!
Alex
--
<https://www.alejandro-colomar.es>
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
prev parent reply other threads:[~2026-11-06 21:06 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-11-06 13:35 git-ls-files(1) avoiding symlinks Alejandro Colomar
2026-11-06 14:15 ` D. Ben Knoble
2026-11-06 14:45 ` Alejandro Colomar
[not found] ` <AE63992D-7BEA-413D-A372-78708CFA8F6F@gmail.com>
2026-11-06 19:36 ` Alejandro Colomar
2026-11-06 20:16 ` Junio C Hamano
2026-11-06 21:06 ` Alejandro Colomar [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=au49oFqexVxPUm-2@debian \
--to=alx+git@kernel.org \
--cc=andy@kernel.org \
--cc=ben.knoble@gmail.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=krzk@kernel.org \
--cc=torvalds@linux-foundation.org \
/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