Skip to content

Commit

Permalink
git submodule add: Require the new --force option to add ignored paths
Browse files Browse the repository at this point in the history
To make the behavior of "git submodule add" more consistent with "git add"
ignored submodule paths should not be silently added when they match an
entry in a .gitignore file. To be able to override that default behavior
in the same way as we can do that for "git add", the new option "--force"
is introduced.

Signed-off-by: Jens Lehmann <Jens.Lehmann@web.de>
Acked-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Jens Lehmann authored and Junio C Hamano committed Jul 19, 2010
1 parent 8fbe9b3 commit d27b876
Show file tree
Hide file tree
Showing 3 changed files with 35 additions and 15 deletions.
7 changes: 6 additions & 1 deletion Documentation/git-submodule.txt
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ git-submodule - Initialize, update or inspect submodules
SYNOPSIS
--------
[verse]
'git submodule' [--quiet] add [-b branch]
'git submodule' [--quiet] add [-b branch] [-f|--force]
[--reference <repository>] [--] <repository> [<path>]
'git submodule' [--quiet] status [--cached] [--recursive] [--] [<path>...]
'git submodule' [--quiet] init [--] [<path>...]
Expand Down Expand Up @@ -187,6 +187,11 @@ OPTIONS
--branch::
Branch of repository to add as submodule.

-f::
--force::
This option is only valid for the add command.
Allow adding an otherwise ignored submodule path.

--cached::
This option is only valid for status and summary commands. These
commands typically use the commit found in the submodule HEAD, but
Expand Down
16 changes: 14 additions & 2 deletions git-submodule.sh
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
# Copyright (c) 2007 Lars Hjemli

dashless=$(basename "$0" | sed -e 's/-/ /')
USAGE="[--quiet] add [-b branch] [--reference <repository>] [--] <repository> [<path>]
USAGE="[--quiet] add [-b branch] [-f|--force] [--reference <repository>] [--] <repository> [<path>]
or: $dashless [--quiet] status [--cached] [--recursive] [--] [<path>...]
or: $dashless [--quiet] init [--] [<path>...]
or: $dashless [--quiet] update [--init] [-N|--no-fetch] [--rebase] [--reference <repository>] [--merge] [--recursive] [--] [<path>...]
Expand All @@ -19,6 +19,7 @@ require_work_tree

command=
branch=
force=
reference=
cached=
recursive=
Expand Down Expand Up @@ -133,6 +134,9 @@ cmd_add()
branch=$2
shift
;;
-f | --force)
force=$1
;;
-q|--quiet)
GIT_QUIET=1
;;
Expand Down Expand Up @@ -201,6 +205,14 @@ cmd_add()
git ls-files --error-unmatch "$path" > /dev/null 2>&1 &&
die "'$path' already exists in the index"

if test -z "$force" && ! git add --dry-run --ignore-missing "$path" > /dev/null 2>&1
then
echo >&2 "The following path is ignored by one of your .gitignore files:" &&
echo >&2 $path &&
echo >&2 "Use -f if you really want to add it."
exit 1
fi

# perhaps the path exists and is already a git repo, else clone it
if test -e "$path"
then
Expand Down Expand Up @@ -234,7 +246,7 @@ cmd_add()
) || die "Unable to checkout submodule '$path'"
fi

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

git config -f .gitmodules submodule."$path".path "$path" &&
Expand Down
27 changes: 15 additions & 12 deletions t/t7400-submodule-basic.sh
Original file line number Diff line number Diff line change
Expand Up @@ -86,25 +86,28 @@ test_expect_success 'submodule add' '
test_cmp empty untracked
'

test_expect_success 'submodule add to .gitignored path' '
echo "refs/heads/master" >expect &&
>empty &&
test_expect_success 'submodule add to .gitignored path fails' '
(
cd addtest-ignore &&
cat <<-\EOF >expect &&
The following path is ignored by one of your .gitignore files:
submod
Use -f if you really want to add it.
EOF
# 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
) &&
! git submodule add "$submodurl" submod >actual 2>&1 &&
test_cmp expect actual
)
'

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 to .gitignored path with --force' '
(
cd addtest-ignore &&
git submodule add --force "$submodurl" submod
)
'

test_expect_success 'submodule add --branch' '
Expand Down

0 comments on commit d27b876

Please sign in to comment.