git-submodule - Allow adding a submodule in-place

When working in the top-level project, it is useful to create a new
submodule as a git repo in a subdirectory, then add that submodule to
the top-level in place.

This patch allows "git submodule add <intended url> subdir" to add the
existing subdir to the current project.  The presumption is the user will
later push / clone the subdir to the <intended url> so that future
submodule init / updates will work.

Absent this patch, "git submodule add" insists upon cloning the subdir
from a repository at the given url, which is fine for adding an existing
project in, but less useful when adding a new submodule from scratch to an
existing project.  The former functionality remains, and the clone is
attempted if the subdir does not already exist as a valid git repo.

Signed-off-by: Mark Levedahl <mlevedahl@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Mark Levedahl 2008-03-04 20:15:02 -05:00 коммит произвёл Junio C Hamano
Родитель c95b3ad9ea
Коммит d4264ca323
2 изменённых файлов: 33 добавлений и 22 удалений

Просмотреть файл

@ -18,8 +18,9 @@ COMMANDS
-------- --------
add:: add::
Add the given repository as a submodule at the given path Add the given repository as a submodule at the given path
to the changeset to be committed next. In particular, the to the changeset to be committed next. If path is a valid
repository is cloned at the specified path, added to the repository within the project, it is added as is. Otherwise,
repository is cloned at the specified path. path is added to the
changeset and registered in .gitmodules. If no path is changeset and registered in .gitmodules. If no path is
specified, the path is deduced from the repository specification. specified, the path is deduced from the repository specification.
If the repository url begins with ./ or ../, it is stored as If the repository url begins with ./ or ../, it is stored as

Просмотреть файл

@ -153,20 +153,6 @@ cmd_add()
usage usage
fi fi
case "$repo" in
./*|../*)
# dereference source url relative to parent's url
realrepo="$(resolve_relative_url $repo)" ;;
*)
# Turn the source into an absolute path if
# it is local
if base=$(get_repo_base "$repo"); then
repo="$base"
fi
realrepo=$repo
;;
esac
# Guess path from repo if not specified or strip trailing slashes # Guess path from repo if not specified or strip trailing slashes
if test -z "$path"; then if test -z "$path"; then
path=$(echo "$repo" | sed -e 's|/*$||' -e 's|:*/*\.git$||' -e 's|.*[/:]||g') path=$(echo "$repo" | sed -e 's|/*$||' -e 's|:*/*\.git$||' -e 's|.*[/:]||g')
@ -174,15 +160,39 @@ cmd_add()
path=$(echo "$path" | sed -e 's|/*$||') path=$(echo "$path" | sed -e 's|/*$||')
fi fi
test -e "$path" &&
die "'$path' already exists"
git ls-files --error-unmatch "$path" > /dev/null 2>&1 && git ls-files --error-unmatch "$path" > /dev/null 2>&1 &&
die "'$path' already exists in the index" die "'$path' already exists in the index"
module_clone "$path" "$realrepo" || exit # perhaps the path exists and is already a git repo, else clone it
(unset GIT_DIR; cd "$path" && git checkout -q ${branch:+-b "$branch" "origin/$branch"}) || if test -e "$path"
die "Unable to checkout submodule '$path'" then
if test -d "$path/.git" &&
test "$(unset GIT_DIR; cd $path; git rev-parse --git-dir)" = ".git"
then
echo "Adding existing repo at '$path' to the index"
else
die "'$path' already exists and is not a valid git repo"
fi
else
case "$repo" in
./*|../*)
# dereference source url relative to parent's url
realrepo="$(resolve_relative_url $repo)" ;;
*)
# Turn the source into an absolute path if
# it is local
if base=$(get_repo_base "$repo"); then
repo="$base"
fi
realrepo=$repo
;;
esac
module_clone "$path" "$realrepo" || exit
(unset GIT_DIR; cd "$path" && git checkout -q ${branch:+-b "$branch" "origin/$branch"}) ||
die "Unable to checkout submodule '$path'"
fi
git add "$path" || git add "$path" ||
die "Failed to add submodule '$path'" die "Failed to add submodule '$path'"