git-rm fu

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Given:

$ git init
Initialized empty Git repository in .git/
$ echo one >> git-foo.sh
$ mkdir subdir
$ echo two >> subdir/git-foo.sh
$ mkdir subdir/snizzle
$ echo three >> subdir/snizzle/git-foo.sh
$ git add .
$ git commit -m"All quiet on the western front."
Created initial commit 15fe70d: All quiet on the western front.
 3 files changed, 3 insertions(+), 0 deletions(-)
 create mode 100644 git-foo.sh
 create mode 100644 subdir/git-foo.sh
 create mode 100644 subdir/snizzle/git-foo.sh

The "git rm" manual's second example says:

    git-rm -f git-*.sh

        Remove all git-*.sh scripts that are in the index. 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.

It is not true that this command will remove all git-*.sh scripts
that are in the index.  Here are three:

    $ git ls-files
    git-foo.sh
    subdir/git-foo.sh
    subdir/snizzle/git-foo.sh

Using -f on this command is a red herring.  Using -f or -n
doesn't matter, and since we want to do more than one command
here, I'm just going to show it all using -n:

The effect of the command is to match just one file at the top level:

    $ git rm -n git-*.sh
    rm 'git-foo.sh'

Furthermore, there is an implication in the wording of the
second example that suggests that if you had let git expand the
file glob, the subdir/git-foo.sh file would have been removed.

Also not true:

    $ git rm -n git-\*.sh
    rm 'git-foo.sh'

To actually get the behavior of "removing all git-*.sh scripts
from the index", you have to prefix a file glob at the front
of the paths to match directories too:

    $ git rm -n \*git-\*.sh
    rm 'git-foo.sh'
    rm 'subdir/git-foo.sh'
    rm 'subdir/snizzle/git-foo.sh'

But then, using any of:

        \*git-\*.sh
        \*git-*.sh
        *git-\*.sh

all effectively *will* match subdir/git-foo.sh:

    $ git rm -n \*git-*.sh
    rm 'git-foo.sh'
    rm 'subdir/git-foo.sh'
    rm 'subdir/snizzle/git-foo.sh'

    $ git rm -n *git-\*.sh
    rm 'git-foo.sh'
    rm 'subdir/git-foo.sh'
    rm 'subdir/snizzle/git-foo.sh'

So it seems that the two parts discussed in the second example
are really unrelated.

It seems like "git rm d2/*" should remove all of d2's files
without trying to recursively remove any subdirectories,
but it won't:

    $ git rm -n d2/*
    fatal: not removing 'd2/two' recursively without -r

But then using -r force d2/two/ to be removed as well:

    $ git rm -n d2/\*
    rm 'd2/two/xyzzy'
    rm 'd2/x'
    rm 'd2/y'
    rm 'd2/z'

There's no real way to say "just the files in d2/".

(Yeah, sure, I could have said "git rm d2/\?", but that wouldn't
work if d2/xyzzy existed too. :-))

jdl
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]

  Powered by Linux