Jens Lehmann <jens.lehm...@web.de> writes:
> Am 28.01.2013 21:34, schrieb Junio C Hamano:
>> I was imagining that "foreach --untracked" could go something like this:
>> * If you are inside an existing git repository, read its index to
>> learn the gitlinks in the directory and its subdirectories.
>> * Start from the current directory and recursively apply the
>> procedure in this step:
>> * Scan the directory and iterate over the ones that has ".git" in
>> * If it is a gitlinked one, show it, but do not descend into it
>> unless --recursive is given (e.g. you start from /home/jens,
>> find /home/jens/proj/ directory that has /home/jens/proj/.git
>> in it. /home/jens/.git/index knows that it is a submodule of
>> the top-level superproject. "proj" is handled, and it is up
>> to the --recursive option if its submodules are handled).
>> * If it is _not_ a gitlinked one, show it and descend into it
>> (e.g. /home/jens/ is not a repository or /home/jens/proj is
>> not a tracked submodule) to apply this procedure recursively.
>> Of course, without --untracked, we have no need to iterate over the
>> readdir() return values; instead we just scan the index of the
>> top-level superproject.
> Thanks for explaining, that makes tons of sense.
There is a small thinko above, though, and I'd like to correct it
before anybody takes the above too seriously as _the_ outline of the
design and implements it to the letter.
The --recursive option should govern both a tracked submodule and an
untracked one. When asking to list both existing submodules and
directories that could become submodules, you should be able to say
$ git submodule foreach --untracked
to list the direct submodules and the directories with .git in them
that are not yet submodules of the top-level superproject, but the
latter is limited to those with no parent directories with .git in
them (other than the top-level of the working tree of the
$ git submodule foreach --untracked --recursive
you would see submodules and their submodules recursively, and also
directories with .git in them (i.e. candidates to become direct
submodules of the superproject) and the directories with .git in
them inside such submodule candidates (i.e. candidates to become
direct submodules of the directories that could become direct
submodules of the superproject) recursively.
If we set things up this way:
mkdir -p a/b c/d &&
for d in . a a/b c c/d
git init $d &&
( cd $d && git commit --allow-empty -m initial )
git add a &&
( cd a && git add b )
The expected results for various combinations are:
* "git submodule foreach" would visit 'a' and nothing else;
* "git submodule foreach --recursive" would visit 'a' and 'a/b';
* "git submodule foreach --untracked" would visit 'a' and 'c'; and
* "git submodule foreach --untracked --recursive" would visit all four.
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html