git submodule: add submodules with git add -f <path>

Change `git submodule add' to add the new submodule <path> with `git
add --force'.

I keep my /etc in .git with a .gitignore that contains just
"*". I.e. `git status' will ignore everything that isn't in the tree
already. When I do:

    git submodule add <url> hlagh

git-submodule will get as far as checking out the remote repository
into hlagh, but it'll die right afterwards when it fails to add the
new path:

    The following paths are ignored by one of your .gitignore files:
    hlagh
    Use -f if you really want to add them.
    fatal: no files added
    Failed to add submodule 'hlagh'

Currently there's no way to add a submodule in this situation other
than to remove the ignored path from the .gitignore while I'm at it.

That's silly, when you run `git submodule add' you're explicitly
saying that you want to add something *new* to the repository. Instead
it should just add the path with `git add --force'.

Initially I implemented this by adding new -f and --force options to
`git submodule add'. But if the --force option isn't supplied it'll
get as far as cloning `hlagh', but won't add it.

So the first thing the user has to do is to remove `hlagh' and then
try again with the --force option.

That sucks, it should just add the path to begin with. I can't think
of any usecase where you've gone through the trouble of typing out
`git submodule add ..', but wish to be overriden by a `gitignore'. The
submodule semantics should be more like `git init', not `git add'.

Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
maint
Ævar Arnfjörð Bjarmason 2010-07-05 17:33:03 +00:00 committed by Junio C Hamano
parent 45e9a825ed
commit 31991b0260
3 changed files with 29 additions and 3 deletions

View File

@ -95,6 +95,10 @@ is the superproject and submodule repositories will be kept
together in the same relative location, and only the together in the same relative location, and only the
superproject's URL needs to be provided: git-submodule will correctly superproject's URL needs to be provided: git-submodule will correctly
locate the submodule using the relative URL in .gitmodules. locate the submodule using the relative URL in .gitmodules.
+
The submodule will be added with "git add --force <path>". I.e. git
doesn't care if the new path is in a `gitignore`. Your invocation of
"git submodule add" is considered enough to override it.


status:: status::
Show the status of the submodules. This will print the SHA-1 of the Show the status of the submodules. This will print the SHA-1 of the

View File

@ -234,12 +234,12 @@ cmd_add()
) || die "Unable to checkout submodule '$path'" ) || die "Unable to checkout submodule '$path'"
fi fi


git add "$path" || git add --force "$path" ||
die "Failed to add submodule '$path'" die "Failed to add submodule '$path'"


git config -f .gitmodules submodule."$path".path "$path" && git config -f .gitmodules submodule."$path".path "$path" &&
git config -f .gitmodules submodule."$path".url "$repo" && git config -f .gitmodules submodule."$path".url "$repo" &&
git add .gitmodules || git add --force .gitmodules ||
die "Failed to register submodule '$path'" die "Failed to register submodule '$path'"
} }



View File

@ -42,7 +42,8 @@ test_expect_success 'setup - hide init subdirectory' '
' '


test_expect_success 'setup - repository to add submodules to' ' test_expect_success 'setup - repository to add submodules to' '
git init addtest git init addtest &&
git init addtest-ignore
' '


# The 'submodule add' tests need some repository to add as a submodule. # The 'submodule add' tests need some repository to add as a submodule.
@ -85,6 +86,27 @@ test_expect_success 'submodule add' '
test_cmp empty untracked test_cmp empty untracked
' '


test_expect_success 'submodule add to .gitignored path' '
echo "refs/heads/master" >expect &&
>empty &&

(
cd addtest-ignore &&
# Does not use test_commit due to the ignore
echo "*" > .gitignore &&
git add --force .gitignore &&
git commit -m"Ignore everything" &&
git submodule add "$submodurl" submod &&
git submodule init
) &&

rm -f heads head untracked &&
inspect addtest/submod ../.. &&
test_cmp expect heads &&
test_cmp expect head &&
test_cmp empty untracked
'

test_expect_success 'submodule add --branch' ' test_expect_success 'submodule add --branch' '
echo "refs/heads/initial" >expect-head && echo "refs/heads/initial" >expect-head &&
cat <<-\EOF >expect-heads && cat <<-\EOF >expect-heads &&