{"thread":{"id":"53442","subject":"git check-ignore --verbose fails oddly when invoked via an alias","startedAt":"2020-05-10T19:59:24Z","lastAt":"2020-05-11T00:29:56Z","messageCount":2,"participants":["D. Ben Knoble","Đoàn Trần Công Danh"],"isPatch":false,"patchVersion":null,"patchTotal":null},"messages":[{"id":"397514","messageId":"CALnO6CBiAy-Jf+q7Qr3rtV9wy3f7ySd0SgK1ckCZvz30ER3i6g@mail.gmail.com","threadId":"53442","inReplyTo":null,"subject":"git check-ignore --verbose fails oddly when invoked via an alias","fromName":"D. Ben Knoble","fromEmail":"ben.knoble@gmail.com","sentAt":"2020-05-10T19:59:08Z","receivedAt":"2020-05-10T19:59:24Z","isPatch":false,"sender":{"key":"ben.knoble@gmail.com","avatar":"https://avatars.githubusercontent.com/u/22802209?v=4"},"body":"Hello all,\n\nI have some bizarre behavior I cannot explain. Worse, I've had a hard\ntime coming up with a minimal test-case for it.\n\nI have the following two aliases:\n\n    ig = check-ignore\n    igv = !git ig --verbose\n\nI use them to verify git-ignore rules occasionally. Today, I was\nworking on a project where git igv * kept failing (exit code 1,\nindicating none of the provided files are ignored). However, when I do\ngit check-ignore --verbose *, I get the expected output.\n\nYou'll even see in the GIT_TRACE outputs above that one behaves very\ndifferently from the other for unknown reasons\n\nDebugging information:\n\n$ pwd\n/Users/Knoble/write/junk-drawer/code\n$ g rev-parse --show-toplevel\n/Users/Knoble/write/junk-drawer\n$ tree -a sml-binary\nsml-binary/\n├── .cm\n│   ├── GUID\n│   │   └── myprog.sml\n│   ├── SKEL\n│   │   └── myprog.sml\n│   └── amd64-unix\n│       └── myprog.sml\n├── .gitignore\n├── Makefile\n├── myprog\n├── myprog.amd64-darwin\n├── myprog.cm\n├── myprog.sml\n└── tmp\n    ├── bin\n    │   └── myprog\n    └── lib\n        └── myprog.amd64-darwin\n\n7 directories, 11 files\n$ cat sml-binary/.gitignore\nmyprog\nmyprog.amd64-darwin\n$ g check-ignore sml-binary/*\nsml-binary/myprog\nsml-binary/myprog.amd64-darwin\n$ g check-ignore --verbose sml-binary/*\ncode/sml-binary/.gitignore:1:myprog sml-binary/myprog\ncode/sml-binary/.gitignore:2:myprog.amd64-darwin sml-binary/myprog.amd64-darwin\n$ g ig sml-binary/*\nsml-binary/myprog\nsml-binary/myprog.amd64-darwin\n$ g igv sml-binary/*\n$ echo $?\n1\n$ pushd sml-binary/\n~/write/junk-drawer/code/sml-binary ~/write/junk-drawer/code\n~/write/junk-drawer/code/sml-binary\n$ g ig *\nmyprog\nmyprog.amd64-darwin\n$ g ig --verbose *\ncode/sml-binary/.gitignore:1:myprog myprog\ncode/sml-binary/.gitignore:2:myprog.amd64-darwin myprog.amd64-darwin\n$ g igv *\n$ echo $?\n1\n$ GIT_TRACE2=2 g igv *\n15:48:21.773549 common-main.c:48                  version 2.26.2\n15:48:21.773904 common-main.c:49                  start git igv\nMakefile myprog myprog.amd64-darwin myprog.cm myprog.sml tmp\n15:48:21.774443 git.c:697                         cmd_name\n_run_dashed_ (_run_dashed_)\n15:48:21.774473 run-command.c:735                 child_start[0]\ngit-igv Makefile myprog myprog.amd64-darwin myprog.cm myprog.sml tmp\n15:48:21.774735 run-command.c:950                 child_exit[0] pid:-1\ncode:-1 elapsed:0.000249\n15:48:21.775368 repository.c:130                  worktree\n/Users/Knoble/write/junk-drawer\n15:48:21.775427 git.c:352                         alias igv -> 'git ig\n--verbose' Makefile myprog myprog.amd64-darwin myprog.cm myprog.sml\ntmp\n15:48:21.775439 git.c:354                         cmd_name\n_run_shell_alias_ (_run_dashed_/_run_shell_alias_)\n15:48:21.775445 run-command.c:735                 child_start[1] 'git\nig --verbose' Makefile myprog myprog.amd64-darwin myprog.cm myprog.sml\ntmp\n15:48:21.786123 common-main.c:48                  version 2.26.2\n15:48:21.786579 common-main.c:49                  start git ig\n--verbose Makefile myprog myprog.amd64-darwin myprog.cm myprog.sml tmp\n15:48:21.787201 git.c:697                         cmd_name\n_run_dashed_ (_run_dashed_/_run_shell_alias_/_run_dashed_)\n15:48:21.787243 run-command.c:735                 child_start[0]\ngit-ig --verbose Makefile myprog myprog.amd64-darwin myprog.cm\nmyprog.sml tmp\n15:48:21.787464 run-command.c:950                 child_exit[0] pid:-1\ncode:-1 elapsed:0.000216\n15:48:21.787781 git.c:389                         alias ig ->\ncheck-ignore --verbose Makefile myprog myprog.amd64-darwin myprog.cm\nmyprog.sml tmp\n15:48:21.787794 git.c:753                         cmd_name\n_run_git_alias_\n(_run_dashed_/_run_shell_alias_/_run_dashed_/_run_git_alias_)\n15:48:21.787801 run-command.c:735                 child_start[1] git\ncheck-ignore --verbose Makefile myprog myprog.amd64-darwin myprog.cm\nmyprog.sml tmp\n15:48:21.793959 common-main.c:48                  version 2.26.2\n15:48:21.794206 common-main.c:49                  start\n/usr/local/Cellar/git/2.26.2/libexec/git-core/git check-ignore\n--verbose Makefile myprog myprog.amd64-darwin myprog.cm myprog.sml tmp\n15:48:21.794427 repository.c:130                  worktree\n/Users/Knoble/write/junk-drawer\n15:48:21.794671 git.c:440                         cmd_name\ncheck-ignore (_run_dashed_/_run_shell_alias_/_run_dashed_/_run_git_alias_/check-ignore)\n15:48:21.795513 git.c:674                         exit elapsed:0.003100 code:1\n15:48:21.795529 trace2/tr2_tgt_normal.c:123       atexit elapsed:0.003121 code:1\n15:48:21.795935 run-command.c:990                 child_exit[1]\npid:98684 code:1 elapsed:0.008108\n15:48:21.795971 git.c:773                         exit elapsed:0.012124 code:1\n15:48:21.795995 trace2/tr2_tgt_normal.c:123       atexit elapsed:0.012139 code:1\n15:48:21.796351 run-command.c:990                 child_exit[1]\npid:98683 code:1 elapsed:0.020896\n15:48:21.796391 git.c:358                         exit elapsed:0.024746 code:1\n15:48:21.796416 trace2/tr2_tgt_normal.c:123       atexit elapsed:0.024761 code:1\n$ GIT_TRACE2=2 g ig --verbose *\n15:57:42.274337 common-main.c:48                  version 2.26.2\n15:57:42.274640 common-main.c:49                  start git ig\n--verbose Makefile myprog myprog.amd64-darwin myprog.cm myprog.sml tmp\n15:57:42.275146 git.c:697                         cmd_name\n_run_dashed_ (_run_dashed_)\n15:57:42.275167 run-command.c:735                 child_start[0]\ngit-ig --verbose Makefile myprog myprog.amd64-darwin myprog.cm\nmyprog.sml tmp\n15:57:42.275422 run-command.c:950                 child_exit[0] pid:-1\ncode:-1 elapsed:0.000246\n15:57:42.275763 git.c:389                         alias ig ->\ncheck-ignore --verbose Makefile myprog myprog.amd64-darwin myprog.cm\nmyprog.sml tmp\n15:57:42.275781 git.c:753                         cmd_name\n_run_git_alias_ (_run_dashed_/_run_git_alias_)\n15:57:42.275794 run-command.c:735                 child_start[1] git\ncheck-ignore --verbose Makefile myprog myprog.amd64-darwin myprog.cm\nmyprog.sml tmp\n15:57:42.282613 common-main.c:48                  version 2.26.2\n15:57:42.282876 common-main.c:49                  start\n/usr/local/Cellar/git/2.26.2/libexec/git-core/git check-ignore\n--verbose Makefile myprog myprog.amd64-darwin myprog.cm myprog.sml tmp\n15:57:42.283146 repository.c:130                  worktree\n/Users/Knoble/write/junk-drawer\n15:57:42.283520 git.c:440                         cmd_name\ncheck-ignore (_run_dashed_/_run_git_alias_/check-ignore)\ncode/sml-binary/.gitignore:1:myprog     myprog\ncode/sml-binary/.gitignore:2:myprog.amd64-darwin        myprog.amd64-darwin\n15:57:42.284561 git.c:674                         exit elapsed:0.003839 code:0\n15:57:42.284588 trace2/tr2_tgt_normal.c:123       atexit elapsed:0.003876 code:0\n15:57:42.285171 run-command.c:990                 child_exit[1]\npid:99078 code:0 elapsed:0.009354\n15:57:42.285212 git.c:773                         exit elapsed:0.012930 code:0\n15:57:42.285246 trace2/tr2_tgt_normal.c:123       atexit elapsed:0.012950 code:0\n\nFailed attempt to produce a minimal example:\n\n$ g init\nDépôt Git vide initialisé dans /private/tmp/git-test/.git/\n$ mkdir subdir\n$ touch subdir/{a..c}\n$ ls\nsubdir/\n$ tree\n.\n└── subdir\n    ├── a\n    ├── b\n    └── c\n\n1 directory, 3 files\n$ echo a >> subdir/.gitignore\n$ g status -s\n?? subdir/\n$ g add --intend-to-add .\n$ g status -s\n A subdir/.gitignore\n A subdir/b\n A subdir/c\n$ g commit --all -m 'init'\n[master (commit racine) 832876e] init\n 3 files changed, 1 insertion(+)\n create mode 100644 subdir/.gitignore\n create mode 100644 subdir/b\n create mode 100644 subdir/c\n$ g igv *\n$ echo $?\n1\n# ^^^ expected, nothing ignored\n$ g igv subdir/*\nsubdir/.gitignore:1:a   subdir/a\n# ^^^ also expected???\n\nD. Ben Knoble\n"},{"id":"397519","messageId":"20200511002405.GA16475@danh.dev","threadId":"53442","inReplyTo":"CALnO6CBiAy-Jf+q7Qr3rtV9wy3f7ySd0SgK1ckCZvz30ER3i6g@mail.gmail.com","subject":"Re: git check-ignore --verbose fails oddly when invoked via an alias","fromName":"Đoàn Trần Công Danh","fromEmail":"congdanhqx@gmail.com","sentAt":"2020-05-11T00:24:05Z","receivedAt":"2020-05-11T00:29:56Z","isPatch":false,"sender":{"key":"congdanhqx@gmail.com","avatar":"https://avatars.githubusercontent.com/u/42673067?v=4"},"body":"On 2020-05-10 15:59:08-0400, \"D. Ben Knoble\" <ben.knoble@gmail.com> wrote:\n> I have the following two aliases:\n> \n>     ig = check-ignore\n>     igv = !git ig --verbose\n\nYour \"git igv\" is an alias to a shell command.\n\n> $ pwd\n> /Users/Knoble/write/junk-drawer/code\n> $ g rev-parse --show-toplevel\n> /Users/Knoble/write/junk-drawer\n\nYou're working on subdirectory of git worktree.\n\n> $ tree -a sml-binary\n> sml-binary/\n\n[.snip.]\n\n> $ cat sml-binary/.gitignore\n> myprog\n> myprog.amd64-darwin\n> $ g check-ignore sml-binary/*\n> sml-binary/myprog\n> sml-binary/myprog.amd64-darwin\n> $ g check-ignore --verbose sml-binary/*\n> code/sml-binary/.gitignore:1:myprog sml-binary/myprog\n> code/sml-binary/.gitignore:2:myprog.amd64-darwin sml-binary/myprog.amd64-darwin\n> $ g ig sml-binary/*\n> sml-binary/myprog\n> sml-binary/myprog.amd64-darwin\n> $ g igv sml-binary/*\n> $ echo $?\n> 1\n\nIn git-config(1), we've noted that:\n\n           Note that\n           shell commands will be executed from the top-level directory of a\n           repository, which may not necessarily be the current directory.\n           GIT_PREFIX is set as returned by running git rev-parse\n           --show-prefix from the original current directory. See git-rev-\n           parse(1).\n\nWhich is the parent directory of your \"$PWD\".\n\nSo, two below commands are equivalent:\n\n\t$ git igv sml-binary/*\n\t$ (cd .. && git check-ignore --verbose sml-binary/myprog sml-binary/myprog.amd64-darwin <and other files>)\n\nFrom Git 2.23.0, Git allows recursive alias expansion:\n\n\tigv = ig --verbose\n\n-- \nDanh\n"}]}