threads / discuss / 62453

[Question] How to force relative path output when using `git status --porcelain=2 -z`

Subject: [Question] How to force relative path output when using `git status --porcelain=2 -z`

## tl;dr

3 messages between Nov 5, 2024 and Nov 6, 2024.

replies: 2people: 2as markdown or json

叶志晟· Nov 5, 2024, 16:59 UTC · lore
Hi all,

I am experiencing a problem when parsing the results of `git status`. My primary goal is to parse the output of `git status` programmatically, so I am trying to parse the result of `git status --porcelain=2 -z`.

According to the docs [here](https://git-scm.com/docs/git-status), the `-z` option only changes the entry terminations and implies the `--porcelain=v1` output format if no other format is given. However, the result shows that the path returned is a relative path to the repo root rather than the current directory when using `-z`. Simply using `git status --porcelain=2` returns the relative path to the current directory.

I am wondering how to force the path to be relative to the current directory (for easier cutting and pasting) rather than the repo root when using `git status --porcelain=2 -z`. I would really appreciate it if you could help me!

Regards, Zhisheng

Junio C Hamano· Nov 6, 2024, 00:59 UTC · re: 叶志晟 · lore

Re: [Question] How to force relative path output when using `git status --porcelain=2 -z`

叶志晟 <yzs981130@gmail.com> writes:
> I am experiencing a problem when parsing the results of `git status`.
> My primary goal is to parse the output of `git status`
> programmatically, so I am trying to parse the result of `git status
> --porcelain=2 -z`.

Interesting finding. Here is what I tried in my working tree, where I have a few cruft files left at the top, and ran these commands inside the 't/' subdirectory:

    $ git status --porcelain=1
    ?? +ps8-v2-reftable-iterator-reuse
    ?? :runme.sh
    : git t/master; git status --porcelain=2
    ? ../+ps8-v2-reftable-iterator-reuse
    ? ../:runme.sh
    : git t/master; git status --porcelain=1 -z | tr '\0' '\n'
    ?? +ps8-v2-reftable-iterator-reuse
    ?? :runme.sh
    : git t/master; git status --porcelain=2 -z | tr '\0' '\n'
    ? +ps8-v2-reftable-iterator-reuse
    ? :runme.sh

I haven't dug into the history to see if these inconsistencies in behaviour are deliberate, but I somehow suspect that the output from "--porcelain=2" without "-z" is mistaken. As the porcelain output is designed to be machine parseable with or without "-z" (and the reader of the output, the implementation of a Porcelain command, is responsible for turning it into relative if it prefers), it would be a mistake to turn relative output on based on the lack of "-z".

Not that we can "fix" the output from "--porcelain=2" at this point. To changge them to uniformly show absolute (or relative for that matter), we'd need "--porcelain=3" to preserve these inconsistency output because it is very certain that existing users and scripts already rely on it.

Thanks.
叶志晟· Nov 6, 2024, 05:07 UTC · re: Junio C Hamano · lore

Re: [Question] How to force relative path output when using `git status --porcelain=2 -z`

Hi Junio,
Thank you for the quick response! That is exactly what I have encountered.

I understand that it is highly probable that the result of `git status --porcelain=2` is unexpected, and it may not be fixed due to consistency.

Thanks a lot!
Junio C Hamano <gitster@pobox.com> 于2024年11月6日周三 08:59写道:
Show 40 quoted lines
>
> 叶志晟 <yzs981130@gmail.com> writes:
>
> > I am experiencing a problem when parsing the results of `git status`.
> > My primary goal is to parse the output of `git status`
> > programmatically, so I am trying to parse the result of `git status
> > --porcelain=2 -z`.
>
> Interesting finding.  Here is what I tried in my working tree, where
> I have a few cruft files left at the top, and ran these commands
> inside the 't/' subdirectory:
>
>     $ git status --porcelain=1
>     ?? +ps8-v2-reftable-iterator-reuse
>     ?? :runme.sh
>     : git t/master; git status --porcelain=2
>     ? ../+ps8-v2-reftable-iterator-reuse
>     ? ../:runme.sh
>     : git t/master; git status --porcelain=1 -z | tr '\0' '\n'
>     ?? +ps8-v2-reftable-iterator-reuse
>     ?? :runme.sh
>     : git t/master; git status --porcelain=2 -z | tr '\0' '\n'
>     ? +ps8-v2-reftable-iterator-reuse
>     ? :runme.sh
>
> I haven't dug into the history to see if these inconsistencies in
> behaviour are deliberate, but I somehow suspect that the output from
> "--porcelain=2" without "-z" is mistaken.  As the porcelain output
> is designed to be machine parseable with or without "-z" (and the
> reader of the output, the implementation of a Porcelain command, is
> responsible for turning it into relative if it prefers), it would be
> a mistake to turn relative output on based on the lack of "-z".
>
> Not that we can "fix" the output from "--porcelain=2" at this point.
> To changge them to uniformly show absolute (or relative for that
> matter), we'd need "--porcelain=3" to preserve these inconsistency
> output because it is very certain that existing users and scripts
> already rely on it.
>
> Thanks.
-- 
志晟 叶
yezhisheng.com.cn

← back to recent threads