d4a1cab541
This adds a git-rm command which provides convenience similar to git-add, (and a bit more since it takes care of the rm as well if given -f). Like git-add, git-rm expands the given path names through git-ls-files. This means it only acts on files listed in the index. And it does act recursively on directories by default, (no -r needed as in the case of rm itself). When it recurses, it does not remove empty directories that are left behind. Signed-off-by: Junio C Hamano <junkio@cox.net>
68 lines
1.0 KiB
Bash
Executable File
68 lines
1.0 KiB
Bash
Executable File
#!/bin/sh
|
|
|
|
USAGE='[-f] [-n] [-v] [--] <file>...'
|
|
SUBDIRECTORY_OK='Yes'
|
|
. git-sh-setup
|
|
|
|
index_remove_option=--force-remove
|
|
remove_files=
|
|
show_only=
|
|
verbose=
|
|
while : ; do
|
|
case "$1" in
|
|
-f)
|
|
remove_files=true
|
|
index_remote_option=--force
|
|
;;
|
|
-n)
|
|
show_only=true
|
|
;;
|
|
-v)
|
|
verbose=--verbose
|
|
;;
|
|
--)
|
|
shift; break
|
|
;;
|
|
-*)
|
|
usage
|
|
;;
|
|
*)
|
|
break
|
|
;;
|
|
esac
|
|
shift
|
|
done
|
|
|
|
# This is typo-proofing. If some paths match and some do not, we want
|
|
# to do nothing.
|
|
case "$#" in
|
|
0) ;;
|
|
*)
|
|
git-ls-files --error-unmatch -- "$@" >/dev/null || {
|
|
echo >&2 "Maybe you misspelled it?"
|
|
exit 1
|
|
}
|
|
;;
|
|
esac
|
|
|
|
files=$(
|
|
if test -f "$GIT_DIR/info/exclude" ; then
|
|
git-ls-files \
|
|
--exclude-from="$GIT_DIR/info/exclude" \
|
|
--exclude-per-directory=.gitignore -- "$@"
|
|
else
|
|
git-ls-files \
|
|
--exclude-per-directory=.gitignore -- "$@"
|
|
fi | sort | uniq
|
|
)
|
|
|
|
case "$show_only" in
|
|
true)
|
|
echo $files
|
|
;;
|
|
*)
|
|
[[ "$remove_files" = "true" ]] && rm -- $files
|
|
git-update-index $index_remove_option $verbose $files
|
|
;;
|
|
esac
|