-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
* cw/remove: git-rm: Fix to properly handle files with spaces, tabs, newlines, etc. Add new git-rm command with documentation
- Loading branch information
Showing
5 changed files
with
221 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -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 | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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 | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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 |