Merge branch 'cw/remove' into next
* cw/remove: git-rm: Fix to properly handle files with spaces, tabs, newlines, etc. Add new git-rm command with documentation
This commit is contained in:
commit
f6b39fe779
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 \
|
||||||
|
70
git-rm.sh
Executable file
70
git-rm.sh
Executable file
@ -0,0 +1,70 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
USAGE='[-f] [-n] [-v] [--] <file>...'
|
||||||
|
SUBDIRECTORY_OK='Yes'
|
||||||
|
. git-sh-setup
|
||||||
|
|
||||||
|
remove_files=
|
||||||
|
show_only=
|
||||||
|
verbose=
|
||||||
|
while : ; do
|
||||||
|
case "$1" in
|
||||||
|
-f)
|
||||||
|
remove_files=true
|
||||||
|
;;
|
||||||
|
-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
|
||||||
|
|
||||||
|
if test -f "$GIT_DIR/info/exclude"
|
||||||
|
then
|
||||||
|
git-ls-files -z \
|
||||||
|
--exclude-from="$GIT_DIR/info/exclude" \
|
||||||
|
--exclude-per-directory=.gitignore -- "$@"
|
||||||
|
else
|
||||||
|
git-ls-files -z \
|
||||||
|
--exclude-per-directory=.gitignore -- "$@"
|
||||||
|
fi |
|
||||||
|
case "$show_only,$remove_files" in
|
||||||
|
true,*)
|
||||||
|
xargs -0 echo
|
||||||
|
;;
|
||||||
|
*,true)
|
||||||
|
xargs -0 sh -c "
|
||||||
|
while [ \$# -gt 0 ]; do
|
||||||
|
file=\$1; shift
|
||||||
|
rm -- \"\$file\" && git-update-index --remove $verbose \"\$file\"
|
||||||
|
done
|
||||||
|
" inline
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
git-update-index --force-remove $verbose -z --stdin
|
||||||
|
;;
|
||||||
|
esac
|
60
t/t3600-rm.sh
Executable file
60
t/t3600-rm.sh
Executable file
@ -0,0 +1,60 @@
|
|||||||
|
#!/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, some with funny characters
|
||||||
|
touch -- foo bar baz 'space embedded' 'tab embedded' 'newline
|
||||||
|
embedded' -q
|
||||||
|
git-add -- foo bar baz 'space embedded' 'tab embedded' 'newline
|
||||||
|
embedded' -q
|
||||||
|
git-commit -m "add files"
|
||||||
|
|
||||||
|
test_expect_success \
|
||||||
|
'Pre-check that foo exists and is in index before git-rm foo' \
|
||||||
|
'[ -f foo ] && git-ls-files --error-unmatch foo'
|
||||||
|
|
||||||
|
test_expect_success \
|
||||||
|
'Test that git-rm foo succeeds' \
|
||||||
|
'git-rm foo'
|
||||||
|
|
||||||
|
test_expect_success \
|
||||||
|
'Post-check that foo exists but is not in index after git-rm foo' \
|
||||||
|
'[ -f foo ] && ! git-ls-files --error-unmatch foo'
|
||||||
|
|
||||||
|
test_expect_success \
|
||||||
|
'Pre-check that bar exists and is in index before "git-rm -f bar"' \
|
||||||
|
'[ -f bar ] && git-ls-files --error-unmatch bar'
|
||||||
|
|
||||||
|
test_expect_success \
|
||||||
|
'Test that "git-rm -f bar" succeeds' \
|
||||||
|
'git-rm -f bar'
|
||||||
|
|
||||||
|
test_expect_success \
|
||||||
|
'Post-check that bar does not exist and is not in index after "git-rm -f bar"' \
|
||||||
|
'! [ -f bar ] && ! git-ls-files --error-unmatch bar'
|
||||||
|
|
||||||
|
test_expect_success \
|
||||||
|
'Test that "git-rm -- -q" succeeds (remove a file that looks like an option)' \
|
||||||
|
'git-rm -- -q'
|
||||||
|
|
||||||
|
test_expect_success \
|
||||||
|
"Test that \"git-rm -f\" succeeds with embedded space, tab, or newline characters." \
|
||||||
|
"git-rm -f 'space embedded' 'tab embedded' 'newline
|
||||||
|
embedded'"
|
||||||
|
|
||||||
|
chmod u-w .
|
||||||
|
test_expect_failure \
|
||||||
|
'Test that "git-rm -f" fails if its rm fails' \
|
||||||
|
'git-rm -f baz'
|
||||||
|
chmod u+w .
|
||||||
|
|
||||||
|
test_expect_success \
|
||||||
|
'When the rm in "git-rm -f" fails, it should not remove the file from the index' \
|
||||||
|
'git-ls-files --error-unmatch baz'
|
||||||
|
|
||||||
|
test_done
|
Loading…
Reference in New Issue
Block a user