зеркало из https://github.com/microsoft/git.git
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:
Родитель
c95b3ad9ea
Коммит
d4264ca323
|
@ -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'"
|
||||||
|
|
||||||
|
|
Загрузка…
Ссылка в новой задаче