threads / discuss / 33066

"git commit" fails due to spurious file in index

Subject: "git commit" fails due to spurious file in index

## tl;dr

5 messages between Mar 4, 2013 and Mar 5, 2013.

replies: 4people: 3as markdown or json

Robert Irelan· Mar 4, 2013, 18:15 UTC · lore
Hello all:

This is my first time posting to this mailing list, but it appears to me, through a Google search, that this is where you go to report what might be bugs. I'm not sure if this is a bug or not, but it is mysterious to me.

My git repository has this directory structure (I don't know if the file names are necessary or not; only the leaf directories contain files):

    $ tree -ad -I.git
    .
    └── admin_scripts
        ├── integchk
        │   ├── 2012
        │   └── 2014
        ├── jrnadmin
        │   ├── 2012
        │   └── 2014
        └── logarchiver
            ├── 2012
            └── 2014
    10 directories

The last commit in this repo was a rearrangement of the hierarchy carried out using `git mv`. Before, the directory structure went `admin_scripts/version/script_name` instead of `admin_scripts/script_name/version`.

Now I'm attempting to some new files that I've already created into the repository, so that the repo now looks like this (`setup/2012` contains files, while `setup/2014` is empty):

    $ tree -ad -I.git
    .
    └── admin_scripts
        ├── integchk
        │   ├── 2012
        │   └── 2014
        ├── jrnadmin
        │   ├── 2012
        │   └── 2014
        ├── logarchiver
        │   ├── 2012
        │   └── 2014
        └── setup
            ├── 2012
            └── 2014
    13 directories

Now, when I run 'git add admin_script/setup' to add the new directory to the repo and then try to commit, I receive the following message:

    $ git commit
    mv: cannot stat `admin_scripts/setup/2012/setup': No such file or directory

The error message is correct in that `admin_scripts/setup/2012/setup` does not exist, either as a file or as a directory. However, I'm not attempting to add this path at all. Using grep, I've confirmed that the only place this path appears in any of my files is in `.git/index`.

Also, I can commit to other places in the repository without triggering any error. In addition, I can clone the repository to other locations and apply the problematic commit manually. This is how I've worked around the problem for now, and I've moved the repository that's exhibiting problems to another directory and started work on the cloned copy.

Why is this spurious path appearing in the index? Is it a bug, or a symptom that my repo has been somehow corrupted? Any help would be greatly appreciated.

Robert Irelan | Server Systems | Epic | (608) 271-9000
Thomas Rast· Mar 4, 2013, 20:58 UTC · re: Robert Irelan · lore

Re: "git commit" fails due to spurious file in index

Robert Irelan <rirelan@epic.com> writes:
Show 10 quoted lines
> Now, when I run 'git add admin_script/setup' to add the new directory to
> the repo and then try to commit, I receive the following message:
>
>     $ git commit
>     mv: cannot stat `admin_scripts/setup/2012/setup': No such file or directory
>
> The error message is correct in that `admin_scripts/setup/2012/setup`
> does not exist, either as a file or as a directory. However, I'm not
> attempting to add this path at all. Using grep, I've confirmed that the
> only place this path appears in any of my files is in `.git/index`.

To me that sounds like the message comes from a commit hook. Can you check if you have anything in .git/hooks/, especially pre-commit?

There really isn't any other good reason why 'git commit' would call 'mv' (plain mv, not git!).

-- 
Thomas Rast
trast@{inf,student}.ethz.ch
Robert Irelan· Mar 5, 2013, 15:30 UTC · re: Thomas Rast · lore

RE: "git commit" fails due to spurious file in index

Yes, you're correct, it was a bug in my pre-commit hook. Thanks!
For posterity, the issue is that I had the following line:
    git diff -z --cached --name-only | egrep -z '\.(pl|pm|t)$' | \
            while read -d'' -r f; do ...

In Bash, when `read` is passed the `-d` option with a zero-length string argument, read will split on null characters (`'\0'`). However, I did not put a space between the `-d` option and the argument, so it took the `-` in the next argument `-r` as the delimiter. My commit includes Perl files with `-` characters in the name, which I had not previously committed to this repo, which is why I only ran into the problem now. I fixed it by changing the read command to `read -r -d '' f`, which now has the crucial space between -d and its argument, making the zero-length string a separate argument.

Robert Irelan | Server Systems | Epic | (608) 271-9000
-----Original Message-----
From: Thomas Rast [mailto:trast@student.ethz.ch] 
Sent: Monday, March 04, 2013 2:59 PM
To: Robert Irelan
Cc: git@vger.kernel.org
Subject: Re: "git commit" fails due to spurious file in index
Robert Irelan <rirelan@epic.com> writes:
Show 11 quoted lines
> Now, when I run 'git add admin_script/setup' to add the new directory 
> to the repo and then try to commit, I receive the following message:
>
>     $ git commit
>     mv: cannot stat `admin_scripts/setup/2012/setup': No such file or 
> directory
>
> The error message is correct in that `admin_scripts/setup/2012/setup` 
> does not exist, either as a file or as a directory. However, I'm not 
> attempting to add this path at all. Using grep, I've confirmed that 
> the only place this path appears in any of my files is in `.git/index`.
To me that sounds like the message comes from a commit hook.  Can you check if you have anything in .git/hooks/, especially pre-commit?
There really isn't any other good reason why 'git commit' would call 'mv' (plain mv, not git!).

-- Thomas Rast trast@{inf,student}.ethz.ch

Torsten Bögershausen· Mar 5, 2013, 10:40 UTC · re: Robert Irelan · lore

Re: "git commit" fails due to spurious file in index

On 04.03.13 19:15, Robert Irelan wrote:
Show 75 quoted lines
> Hello all:
> 
> This is my first time posting to this mailing list, but it appears to
> me, through a Google search, that this is where you go to report what
> might be bugs. I'm not sure if this is a bug or not, but it is
> mysterious to me.
> 
> My git repository has this directory structure (I don't know if the file
> names are necessary or not; only the leaf directories contain files):
> 
>     $ tree -ad -I.git
>     .
>     └── admin_scripts
>         ├── integchk
>         │   ├── 2012
>         │   └── 2014
>         ├── jrnadmin
>         │   ├── 2012
>         │   └── 2014
>         └── logarchiver
>             ├── 2012
>             └── 2014
> 
>     10 directories
> 
> The last commit in this repo was a rearrangement of the hierarchy
> carried out using `git mv`.  Before, the directory structure went
> `admin_scripts/version/script_name` instead of
> `admin_scripts/script_name/version`.
> 
> Now I'm attempting to some new files that I've already created into the
> repository, so that the repo now looks like this (`setup/2012`
> contains files, while `setup/2014` is empty):
> 
>     $ tree -ad -I.git
>     .
>     └── admin_scripts
>         ├── integchk
>         │   ├── 2012
>         │   └── 2014
>         ├── jrnadmin
>         │   ├── 2012
>         │   └── 2014
>         ├── logarchiver
>         │   ├── 2012
>         │   └── 2014
>         └── setup
>             ├── 2012
>             └── 2014
> 
>     13 directories
> 
> Now, when I run 'git add admin_script/setup' to add the new directory to
> the repo and then try to commit, I receive the following message:
> 
>     $ git commit
>     mv: cannot stat `admin_scripts/setup/2012/setup': No such file or directory
> 
> The error message is correct in that `admin_scripts/setup/2012/setup`
> does not exist, either as a file or as a directory. However, I'm not
> attempting to add this path at all. Using grep, I've confirmed that the
> only place this path appears in any of my files is in `.git/index`.
> 
> Also, I can commit to other places in the repository without triggering
> any error. In addition, I can clone the repository to other locations
> and apply the problematic commit manually. This is how I've worked
> around the problem for now, and I've moved the repository that's
> exhibiting problems to another directory and started work on the cloned
> copy.
> 
> Why is this spurious path appearing in the index? Is it a bug, or a
> symptom that my repo has been somehow corrupted? Any help would be
> greatly appreciated.
> 
> Robert Irelan | Server Systems | Epic | (608) 271-9000

You have come to the right group. It might be difficult to tell (at least for me) if there is a bug or a corruption, May be some tests could help to bring more light into the darkness:

What does "git status" (in the problematic repo) tell you? What does "git fsck" (in the problematic repo) tell you? What does "git ls-files" (in both repos) tell you?

/Torsten
Robert Irelan· Mar 5, 2013, 15:30 UTC · re: Torsten Bögershausen · lore

RE: "git commit" fails due to spurious file in index

Nope, it was a bug in my pre-commit hook. See the other response to this message.
Robert Irelan | Server Systems | Epic | (608) 271-9000
-----Original Message-----
From: Torsten Bögershausen [mailto:tboegi@web.de] 
Sent: Tuesday, March 05, 2013 4:41 AM
To: Robert Irelan
Cc: git@vger.kernel.org
Subject: Re: "git commit" fails due to spurious file in index
On 04.03.13 19:15, Robert Irelan wrote:
Show 76 quoted lines
> Hello all:
> 
> This is my first time posting to this mailing list, but it appears to 
> me, through a Google search, that this is where you go to report what 
> might be bugs. I'm not sure if this is a bug or not, but it is 
> mysterious to me.
> 
> My git repository has this directory structure (I don't know if the 
> file names are necessary or not; only the leaf directories contain files):
> 
>     $ tree -ad -I.git
>     .
>     └── admin_scripts
>         ├── integchk
>         │   ├── 2012
>         │   └── 2014
>         ├── jrnadmin
>         │   ├── 2012
>         │   └── 2014
>         └── logarchiver
>             ├── 2012
>             └── 2014
> 
>     10 directories
> 
> The last commit in this repo was a rearrangement of the hierarchy 
> carried out using `git mv`.  Before, the directory structure went 
> `admin_scripts/version/script_name` instead of 
> `admin_scripts/script_name/version`.
> 
> Now I'm attempting to some new files that I've already created into 
> the repository, so that the repo now looks like this (`setup/2012` 
> contains files, while `setup/2014` is empty):
> 
>     $ tree -ad -I.git
>     .
>     └── admin_scripts
>         ├── integchk
>         │   ├── 2012
>         │   └── 2014
>         ├── jrnadmin
>         │   ├── 2012
>         │   └── 2014
>         ├── logarchiver
>         │   ├── 2012
>         │   └── 2014
>         └── setup
>             ├── 2012
>             └── 2014
> 
>     13 directories
> 
> Now, when I run 'git add admin_script/setup' to add the new directory 
> to the repo and then try to commit, I receive the following message:
> 
>     $ git commit
>     mv: cannot stat `admin_scripts/setup/2012/setup': No such file or 
> directory
> 
> The error message is correct in that `admin_scripts/setup/2012/setup` 
> does not exist, either as a file or as a directory. However, I'm not 
> attempting to add this path at all. Using grep, I've confirmed that 
> the only place this path appears in any of my files is in `.git/index`.
> 
> Also, I can commit to other places in the repository without 
> triggering any error. In addition, I can clone the repository to other 
> locations and apply the problematic commit manually. This is how I've 
> worked around the problem for now, and I've moved the repository 
> that's exhibiting problems to another directory and started work on 
> the cloned copy.
> 
> Why is this spurious path appearing in the index? Is it a bug, or a 
> symptom that my repo has been somehow corrupted? Any help would be 
> greatly appreciated.
> 
> Robert Irelan | Server Systems | Epic | (608) 271-9000

You have come to the right group. It might be difficult to tell (at least for me) if there is a bug or a corruption, May be some tests could help to bring more light into the darkness:

What does "git status" (in the problematic repo) tell you? What does "git fsck" (in the problematic repo) tell you? What does "git ls-files" (in both repos) tell you?

/Torsten

← back to recent threads