Add new git-rm command with documentation
[git.git] / git-rm.sh
diff --git a/git-rm.sh b/git-rm.sh
new file mode 100755 (executable)
index 0000000..0a3f546
--- /dev/null
+++ b/git-rm.sh
@@ -0,0 +1,67 @@
+#!/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