Message ID | xmqqedap2ijk.fsf_-_@gitster.g (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Re* Unexpected behavior with the rev-parse operation | expand |
On Mon, Apr 29, 2024 at 8:07 AM Junio C Hamano <gitster@pobox.com> wrote: > > Eric Sunshine <sunshine@sunshineco.com> writes: > > > On Mon, Apr 15, 2024 at 9:58 AM Toru Okugawa <castor.4bit@gmail.com> wrote: > >> I have encountered some unexpected behavior with the rev-parse operation. > >> --- > >> $ ls -a > >> . .. > >> $ git rev-parse --is-inside-work-tree > >> fatal: not a git repository (or any of the parent directories): .git > >> ... > > ... This > > means it is your responsibility, as a script writer, to suppress or > > capture the error message (whichever is appropriate for your case). > > For instance: > > > > if test git rev-parse >/dev/null 2>&1 > > then > > echo "in a Git directory or repository" > > else > > echo "not in a Git directory or repository" > > fi > > All true. It may however need some documentation updates, though, > something along this line, perhaps? > > Documentation/git-rev-parse.txt | 16 ++++++++++++++-- > 1 file changed, 14 insertions(+), 2 deletions(-) > > diff --git c/Documentation/git-rev-parse.txt w/Documentation/git-rev-parse.txt > index f9d5a35fa0..a62d798744 100644 > --- c/Documentation/git-rev-parse.txt > +++ w/Documentation/git-rev-parse.txt > @@ -18,8 +18,16 @@ Many Git porcelainish commands take a mixture of flags > (i.e. parameters that begin with a dash '-') and parameters > meant for the underlying 'git rev-list' command they use internally > and flags and parameters for the other commands they use > -downstream of 'git rev-list'. This command is used to > -distinguish between them. > +downstream of 'git rev-list'. One purpose of this command is to > +allow calling programs to distinguish between them. > + > +There are a few other operation modes that have noting to do with > +the above "help parse command line options" added to the command. > + > +Unless otherwise specified, most of the options and operation modes > +require you to run this command inside a git repository or a working > +tree that is under control of a git repository, and will give you a > +fatal error otherwise. > > > OPTIONS > @@ -32,11 +40,15 @@ Each of these options must appear first on the command line. > > --parseopt:: > Use 'git rev-parse' in option parsing mode (see PARSEOPT section below). > + The command in this mode can be used outside a repository or > + a working tree controlled by a repository. > > --sq-quote:: > Use 'git rev-parse' in shell quoting mode (see SQ-QUOTE > section below). In contrast to the `--sq` option below, this > mode only does quoting. Nothing else is done to command input. > + The command in this mode can be used outside a repository or > + a working tree controlled by a repository. > > Options for --parseopt > ~~~~~~~~~~~~~~~~~~~~~~ Thank you for your responses. I'm aware that `--is-inside-work-tree` is an option for `git rev-parse`, and I understand that it is normal for the command to generate an error when executed outside a Git repository. Indeed, I have previously used the result of `git rev-parse >/dev/null 2>&1` to determine whether the directory is inside a Git repository or not. However, if determining the presence of a Git repository by checking for errors is the appropriate approach, I'm interested in understanding the intended use of the `--is-inside-work-tree` option. I had thought it was meant to suppress errors in exceptional cases.
Toru Okugawa <castor.4bit@gmail.com> writes: > However, if determining the presence of a Git repository by checking > for errors is the appropriate approach, I'm interested in > understanding the intended use of the `--is-inside-work-tree` option. > I had thought it was meant to suppress errors in exceptional cases. $ rm -fr mine $ git init mine ;# notice the lack of --bare $ cd mine $ git commit --allow-empty -m 'initial' $ git rev-parse --is-inside-work-tree; echo $? true 0 $ cd .git $ git rev-parse --is-inside-work-tree; echo $? false 0 $ cd ../.. $ git --bare init mine.bare ;# this time bare $ cd mine.bare false 0 When you write a script that you might want to use as a part of a hook, for example, you may end up running it inside .git/ and it may be necessary (depending on what the script does and how it is written) to tell where you are in the working tree (or if you are in the working tree in the first place).
On Wed, May 1, 2024 at 3:46 AM Junio C Hamano <gitster@pobox.com> wrote: > > When you write a script that you might want to use as a part of a > hook, for example, you may end up running it inside .git/ and it may > be necessary (depending on what the script does and how it is > written) to tell where you are in the working tree (or if you are in > the working tree in the first place). I misunderstood the purpose of the option initially, but now I understand it. Thank you for your explanation.
diff --git c/Documentation/git-rev-parse.txt w/Documentation/git-rev-parse.txt index f9d5a35fa0..a62d798744 100644 --- c/Documentation/git-rev-parse.txt +++ w/Documentation/git-rev-parse.txt @@ -18,8 +18,16 @@ Many Git porcelainish commands take a mixture of flags (i.e. parameters that begin with a dash '-') and parameters meant for the underlying 'git rev-list' command they use internally and flags and parameters for the other commands they use -downstream of 'git rev-list'. This command is used to -distinguish between them. +downstream of 'git rev-list'. One purpose of this command is to +allow calling programs to distinguish between them. + +There are a few other operation modes that have noting to do with +the above "help parse command line options" added to the command. + +Unless otherwise specified, most of the options and operation modes +require you to run this command inside a git repository or a working +tree that is under control of a git repository, and will give you a +fatal error otherwise. OPTIONS @@ -32,11 +40,15 @@ Each of these options must appear first on the command line. --parseopt:: Use 'git rev-parse' in option parsing mode (see PARSEOPT section below). + The command in this mode can be used outside a repository or + a working tree controlled by a repository. --sq-quote:: Use 'git rev-parse' in shell quoting mode (see SQ-QUOTE section below). In contrast to the `--sq` option below, this mode only does quoting. Nothing else is done to command input. + The command in this mode can be used outside a repository or + a working tree controlled by a repository. Options for --parseopt ~~~~~~~~~~~~~~~~~~~~~~