mirror of
https://github.com/git/git.git
synced 2024-11-05 08:47:56 +01:00
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
5 changed files with 221 additions and 1 deletions
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 \
|
||||
|
|
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 a new issue