Add new git-rm command with documentation
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>
This commit is contained in:
parent
2cf3be1d31
commit
d4a1cab541
1
.gitignore
vendored
1
.gitignore
vendored
@ -84,6 +84,7 @@ git-resolve
|
||||
git-rev-list
|
||||
git-rev-parse
|
||||
git-revert
|
||||
git-rm
|
||||
git-send-email
|
||||
git-send-pack
|
||||
git-sh-setup
|
||||
|
89
Documentation/git-rm.txt
Normal file
89
Documentation/git-rm.txt
Normal file
@ -0,0 +1,89 @@
|
||||
git-rm(1)
|
||||
=========
|
||||
|
||||
NAME
|
||||
----
|
||||
git-rm - Remove files from the working tree and from the index.
|
||||
|
||||
SYNOPSIS
|
||||
--------
|
||||
'git-rm' [-f] [-n] [-v] [--] <file>...
|
||||
|
||||
DESCRIPTION
|
||||
-----------
|
||||
A convenience wrapper for git-update-index --remove. For those coming
|
||||
from cvs, git-rm provides an operation similar to "cvs rm" or "cvs
|
||||
remove".
|
||||
|
||||
|
||||
OPTIONS
|
||||
-------
|
||||
<file>...::
|
||||
Files to remove from the index and optionally, from the
|
||||
working tree as well.
|
||||
|
||||
-f::
|
||||
Remove files from the working tree as well as from the index.
|
||||
|
||||
-n::
|
||||
Don't actually remove the file(s), just show if they exist in
|
||||
the index.
|
||||
|
||||
-v::
|
||||
Be verbose.
|
||||
|
||||
--::
|
||||
This option can be used to separate command-line options from
|
||||
the list of files, (useful when filenames might be mistaken
|
||||
for command-line options).
|
||||
|
||||
|
||||
DISCUSSION
|
||||
----------
|
||||
|
||||
The list of <file> given to the command is fed to `git-ls-files`
|
||||
command to list files that are registered in the index and
|
||||
are not ignored/excluded by `$GIT_DIR/info/exclude` file or
|
||||
`.gitignore` file in each directory. This means two things:
|
||||
|
||||
. You can put the name of a directory on the command line, and the
|
||||
command will remove all files in it and its subdirectories (the
|
||||
directories themselves are never removed from the working tree);
|
||||
|
||||
. Giving the name of a file that is not in the index does not
|
||||
remove that file.
|
||||
|
||||
|
||||
EXAMPLES
|
||||
--------
|
||||
git-rm Documentation/\\*.txt::
|
||||
|
||||
Removes all `\*.txt` files from the index that are under the
|
||||
`Documentation` directory and any of its subdirectories. The
|
||||
files are not removed from the working tree.
|
||||
+
|
||||
Note that the asterisk `\*` is quoted from the shell in this
|
||||
example; this lets the command include the files from
|
||||
subdirectories of `Documentation/` directory.
|
||||
|
||||
git-rm -f git-*.sh::
|
||||
|
||||
Remove all git-*.sh scripts that are in the index. The files
|
||||
are removed from the index, and (because of the -f option),
|
||||
from the working tree as well. Because this example lets the
|
||||
shell expand the asterisk (i.e. you are listing the files
|
||||
explicitly), it does not remove `subdir/git-foo.sh`.
|
||||
|
||||
|
||||
Author
|
||||
------
|
||||
Written by Linus Torvalds <torvalds@osdl.org>
|
||||
|
||||
Documentation
|
||||
--------------
|
||||
Documentation by Junio C Hamano and the git-list <git@vger.kernel.org>.
|
||||
|
||||
GIT
|
||||
---
|
||||
Part of the gitlink:git[7] suite
|
||||
|
2
Makefile
2
Makefile
@ -120,7 +120,7 @@ SCRIPT_SH = \
|
||||
git-merge-one-file.sh git-parse-remote.sh \
|
||||
git-prune.sh git-pull.sh git-push.sh git-rebase.sh \
|
||||
git-repack.sh git-request-pull.sh git-reset.sh \
|
||||
git-resolve.sh git-revert.sh git-sh-setup.sh \
|
||||
git-resolve.sh git-revert.sh git-rm.sh git-sh-setup.sh \
|
||||
git-tag.sh git-verify-tag.sh git-whatchanged.sh \
|
||||
git-applymbox.sh git-applypatch.sh git-am.sh \
|
||||
git-merge.sh git-merge-stupid.sh git-merge-octopus.sh \
|
||||
|
67
git-rm.sh
Executable file
67
git-rm.sh
Executable file
@ -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
|
42
t/t3600-rm.sh
Executable file
42
t/t3600-rm.sh
Executable file
@ -0,0 +1,42 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# Copyright (c) 2006 Carl D. Worth
|
||||
#
|
||||
|
||||
test_description='Test of the various options to git-rm.'
|
||||
|
||||
. ./test-lib.sh
|
||||
|
||||
# Setup some files to be removed
|
||||
touch foo bar
|
||||
git-add foo bar
|
||||
# Need one to test --
|
||||
touch -- -q
|
||||
git update-index --add -- -q
|
||||
git-commit -m "add foo, bar, and -q"
|
||||
|
||||
test_expect_success \
|
||||
'Pre-check that foo is in index before git-rm foo' \
|
||||
'git-ls-files --error-unmatch foo'
|
||||
|
||||
test_expect_success \
|
||||
'Test that git-rm foo succeeds' \
|
||||
'git-rm foo'
|
||||
|
||||
test_expect_failure \
|
||||
'Post-check that foo is not in index after git-rm foo' \
|
||||
'git-ls-files --error-unmatch foo'
|
||||
|
||||
test_expect_success \
|
||||
'Test that "git-rm -f bar" works' \
|
||||
'git-rm -f bar'
|
||||
|
||||
test_expect_failure \
|
||||
'Post-check that bar no longer exists' \
|
||||
'[ -f bar ]'
|
||||
|
||||
test_expect_success \
|
||||
'Test that "git-rm -- -q" works to delete a file named -q' \
|
||||
'git-rm -- -q'
|
||||
|
||||
test_done
|
Loading…
Reference in New Issue
Block a user