Re: [PATCH] git-svn: fix ls-tree usage with dash-prefixed paths
From: Björn Steinbrink <hidden>
Date: 2016-06-15 22:46:31
On 2009.03.29 13:33:02 -0700, Junio C Hamano wrote:
Eric Wong [off-list ref] writes:quoted
To find the blob object name given a tree and pathname, we were incorrectly calling "git ls-tree" with a "--" argument followed by the pathname of the file we wanted to get. git ls-tree <TREE> -- --dashed/path/name.c Unlike many command-line interfaces, the "--" alone does not symbolize the end of non-option arguments on the command-line. ls-tree interprets the "--" as a prefix to match against, thus the entire contents of the --dashed/* hierarchy would be returned because the "--" matches "--dashed" and every path under it.The above makes only half a sense to me. In an empty directory: $ git init Initialized empty Git repository in /tmp/empty/.git $ mkdir -p ./--dashed/path $ >./--dashed/path/name $ git add . $ git ls-files --dashed/path/name $ git commit -a -m initial [master (root-commit) cd44284] initial 0 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 --dashed/path/name $ git ls-tree HEAD^{tree} -- $ git ls-tree HEAD^{tree} -- --dashed/path/name 100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 --dashed/path/name $ mkdir ./-- $ >./--/eman $ git add . $ git commit -m second [master 80f8ef9] second 0 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 --/eman $ git ls-tree HEAD^{tree} -- --dashed/path 100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 --/eman 040000 tree 23e59e0c91294c39ac7c5a2e39efb01d878de9a0 --dashed/path $ exit Perhaps the problem repository had a pathname that is exactly -- (in addition to --dashed/), and ls-tree emitted everything under --/ hierarchy? In other words, your fix to git-svn may be correct and I am reading your problem description above incorrectly?
Your test case is flawed, because you only have a single path in
--dashed/
Initialized empty Git repository in /home/doener/test/.git/
$ mkdir ./--dashed
$ touch ./--dashed/{1,2}
$ git add .
$ git ls-files
--dashed/1
--dashed/2
$ git commit -m init
[master (root-commit) ae7cd83] init
0 files changed, 0 insertions(+), 0 deletions(-)
create mode 100644 --dashed/1
create mode 100644 --dashed/2
$ git ls-tree HEAD^{tree}
040000 tree f353b342b53872c6a510229524f819c4fe0d5c1b --dashed
$ git ls-tree HEAD^{tree} --
$ git ls-tree HEAD^{tree} -- --dashed
040000 tree f353b342b53872c6a510229524f819c4fe0d5c1b --dashed
$ git ls-tree HEAD^{tree} -- --dashed/
100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 --dashed/1
100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 --dashed/2
$ git ls-tree HEAD^{tree} -- --dashed/1
100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 --dashed/1
100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 --dashed/2
Or even more weird (at least to me):
Initialized empty Git repository in /home/doener/test/.git/
$ mkdir foo fab
$ touch {foo,fab}/{1,2}
$ git add .
$ git commit -m init
[master (root-commit) fdb7bb3] init
0 files changed, 0 insertions(+), 0 deletions(-)
create mode 100644 fab/1
create mode 100644 fab/2
create mode 100644 foo/1
create mode 100644 foo/2
$ git ls-files foo/1 fab/1
fab/1
foo/1
$ git ls-files foo/1 fab/1 f
fab/1
foo/1
$ git ls-tree HEAD^{tree} foo/1 fab/1
100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 fab/1
100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 foo/1
$ git ls-tree HEAD^{tree} foo/1 fab/1 f
100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 fab/1
100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 fab/2
100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 foo/1
100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 foo/2
So if you go into some tree, any additional pattern that is a prefix of
the tree name will match the tree and its contents.
Björn