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-list
|
||||||
git-rev-parse
|
git-rev-parse
|
||||||
git-revert
|
git-revert
|
||||||
|
git-rm
|
||||||
git-send-email
|
git-send-email
|
||||||
git-send-pack
|
git-send-pack
|
||||||
git-sh-setup
|
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-merge-one-file.sh git-parse-remote.sh \
|
||||||
git-prune.sh git-pull.sh git-push.sh git-rebase.sh \
|
git-prune.sh git-pull.sh git-push.sh git-rebase.sh \
|
||||||
git-repack.sh git-request-pull.sh git-reset.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-tag.sh git-verify-tag.sh git-whatchanged.sh \
|
||||||
git-applymbox.sh git-applypatch.sh git-am.sh \
|
git-applymbox.sh git-applypatch.sh git-am.sh \
|
||||||
git-merge.sh git-merge-stupid.sh git-merge-octopus.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