ChatGPT解决这个技术问题 Extra ChatGPT

.gitignore and "The following untracked working tree files would be overwritten by checkout"

So I added a folder to my .gitignore file.

Once I do a git status it tells me

# On branch latest
nothing to commit (working directory clean)

However, when I try to change branches I get the following:

My-MacBook-Pro:webapp marcamillion$ git checkout develop
error: The following untracked working tree files would be overwritten by checkout:
    public/system/images/9/thumb/red-stripe.jpg
    public/system/images/9/original/red-stripe.jpg
    public/system/images/8/thumb/red-stripe-red.jpg
    public/system/images/8/original/red-stripe-red.jpg
    public/system/images/8/original/00-louis_c.k.-chewed_up-cover-2008.jpg
    public/system/images/7/thumb/red-stripe-dark.jpg
    public/system/images/7/original/red-stripe-dark.jpg
    public/system/images/7/original/DSC07833.JPG
    public/system/images/6/thumb/red-stripe-bw.jpg
    public/system/images/6/original/website-logo.png
    public/system/images/6/original/red-stripe-bw.jpg
    public/system/images/5/thumb/Guy_Waving_Jamaican_Flag.jpg
    public/system/images/5/original/logocompv-colored-squares-100px.png
    public/system/images/5/original/Guy_Waving_Jamaican_Flag.jpg
    public/system/images/4/thumb/DSC_0001.JPG
    public/system/images/4/original/logo.png
    public/system/images/4/original/DSC_0001.JPG
    public/system/images/4/original/2-up.jpg
    public/system/images/3/thumb/logo2.gif
    public/system/images/3/original/logo2.gif
    public/system/images/3/original/Guy_Waving_Jamaican_Flag.jpg
    public/system/images/3/original/11002000962.jpg
    public/system/images/2/thumb/Profile Pic.jpg
    public/system/images/2/original/Profile Pic.jpg
    public/system/images/2/original/02 Login Screen.jpg
    public/system/images/1/original/Argentina-2010-World-Cup.jpg
Please move or remove them before you can switch branches.
Aborting

This is what my .gitignore file looks like:

.bundle
.DS_Store
db/*.sqlite3
log/*.log
tmp/**/*
public/system/images/*
public/system/avatars/*

How do I get this working so I can switch branches without deleting those files?

If I make a change, will it affect those files? In other words, if I came back to this branch afterwards would everything be perfect as up to my latest commit?

I don't want to lose those files, I just don't want them tracked.

if you really don't care about these files: git checkout -f in My case the files are generated in the build process, so I coudln't care less
Sometimes happens if you do 'git checkout' (without a branch name). To fix, do 'git checkout branchname'
Separate, but critically related question: why does this error occur at all? why can't git just switch between branches?
@ahnbizcad Because if you were working on a new file, and someone on another branch happened to commit a file with the same name, you would be pissed off if git trashed your version when you switched branches. That's why the -f flag is there.

B
Black

WARNING: it will delete untracked files, so it's not a great answer to the question being posed.

I hit this message as well. In my case, I didn't want to keep the files, so this worked for me:

git 2.11 and newer

git clean  -d  -f .

older git

git clean  -d  -f ""

If you also want to remove files ignored by git, then execute the following command.

BE WARNED!!! THIS MOST PROBABLY DESTROYS YOUR PROJECT, USE ONLY IF YOU KNOW 100% WHAT YOU ARE DOING

git 2.11 and newer

git clean  -d  -fx .

older git

git clean  -d  -fx ""

http://www.kernel.org/pub/software/scm/git/docs/git-clean.html

-x means ignored files are also removed as well as files unknown to git.

-d means remove untracked directories in addition to untracked files.

-f is required to force it to run.


Thanks, after that clean I was able to rebase;
BE CAREFUL WHEN RUNNING git clean!
To avoid a facepalm, first run it with the dry-run option to see what it would do: git clean -dfxn or git clean -dfx --dry-run
Holy crap. This deletes all the config files on my xcode and now the project is turning into mac project. BE VERY CAREFUL WHEN RUNNING THIS COMMAND. I thought it would only remove it from git.
The -x option hurts me
a
aerin

Warning: This will delete the local files that are not indexed

Just force it : git checkout -f another-branch


Warning: This will delete the local files that are not indexed.
git clean didn't work for me, but force was exactly what I needed. It was stuck on that branch and I just needed it to change branches.
I didn't want the file that was not indexed! +1 for you
i got this error,,, :( error: pathspec 'mybranch' did not match any file(s) known to git.
This is the real answer.
F
Fry

It seems like you want the files ignored but they have already been commited. .gitignore has no effect on files that are already in the repo so they need to be removed with git rm --cached. The --cached will prevent it from having any effect on your working copy and it will just mark as removed the next time you commit. After the files are removed from the repo then the .gitignore will prevent them from being added again.

But you have another problem with your .gitignore, you are excessively using wildcards and its causing it to match less than you expect it to. Instead lets change the .gitignore and try this.

.bundle
.DS_Store
db/*.sqlite3
log/*.log
tmp/
public/system/images/
public/system/avatars/

Thanks....I removed all the files from the current branch and backed them up. Then switched branches and put them back. That worked. Also, thanks for the tip on the .gitignore though
I was having an issue with a /build folder that doesn't need to be tracked. So I deleted the local folder, committed my .gitignore file, then checked out the other branch. That finally worked for me.
I think the first part is for the reverse of this particular error message. This error is stating the user is currently in a branch that doesn't have those JPG files tracked and the user is trying to move to one that does. So doing git rm --cached will not make a difference, those files don't exist in the current branch. For this error I think the user instead needs to follow @Greg Hewgill's answer - "move them out of working copy, switch branches, and move them back".
How would one go about solving the your files would be overwritten with fatal: pathspec 'test/node_modules' did not match any files when I do git rm -r --cache test/node_modules? I can't pull because of the overwritten message and can't remove because git can't find them (they are there)
@rocksNwaves Does the branch you are trying to change to also have those files committed to it? If so and you do not want those files to be tracked in any branch, you should backup the files outside of the git repo first. Then you can switch to each branch and use git rm to delete the files in that branch and commit. Finally you can move the files back and they wont be overwritten anymore.
m
mattbasta

If you're on OS X, it may be because a file's name has had certain characters change case. Try setting the following config option:

git config core.ignorecase true

It worked on Windows as well, looks like this situation happened in the first place due to case change which GIT couldn't determine
This is exactly the problem I had, a file path was different by one letter case - Windows treats this as same but GIT does not which is the problem.
My problem happened in checkout another branch in Windows 10, and only this work for me, Thanks
awesome! this fix my problem when I was moving between tags
It works also if you try to git rebase as well. Thanks.
u
user7294900

This worked for me.

 1. git fetch --all
 2. git reset --hard origin/{branch_name}

Please add explanation on your solution. see stackoverflow.com/help/how-to-answer
Here's my take. Your local copy of the remote branch actually has all of the untracked files, somehow. You're checking that out to restore the untracked files it originally complained about. Now you can switch to other branches
For some reason, this is the only working solution for me. Thanks mate.
Solved my problem. Thanks
Many thanks, so simple! git reset --soft origin/develop . How I hate these merge conflicts editing. This command so nice and simple.
G
Greg Hewgill

Git is telling you that it wants to create files (named public/system/images/9/... etc), but you already have existing files in that directory that aren't tracked by Git. Perhaps somebody else added those files to the Git repository, and this is the first time you have switched to that branch?

There's probably a reason why those files in your develop branch but not in your current branch. You may have to ask your collaborators why that is.

how do I get this working so I can switch branches without deleting those files?

You can't do it without making the files disappear somehow. You could rename public to my_public or something for now.

if I came back to this branch afterwards would everything be perfect as up to my latest commit?

If you commit your changes, Git won't lose them. If you don't commit your changes, then Git will try really hard not to overwrite work that you have done. That's what Git is warning you about in the first instance here (when you tried to switch branches).


Thanks for the explanation. I backed up the files, switched branches and merged them then replaced the files in the public folder. That worked.
As I commented on @Arrowmaster's answer. This is the right answer for the error message. It may not be the right answer for this particularly questioner since he real problems seems to be his gitignore.
A
Abhishek Goel

There is a command for this delicate task (permanently deleting untracked files)

git clean -i

Then git pull will do.


W
Wolfson

These two functions

git rm --cached git checkout -f another-branch

did NOT work for me.

Instead, I physically removed the file (in eclipse) as what Git tells you to do;

Please move or remove them before you can switch branches.

and then I add/committed it.

and then I pulled and it worked!


R
Rory O'Kane

For those who need something less far-reaching than Scott Schafer’s answer,

git clean -f

will likely work. I highly suggest running

git clean --dry-run

first. That command will output a list of files that Git will remove if you run git clean -f, and might save you the pain of inadvertently removing something you didn’t want to.

See this Stack Oveflow answer or the docs for more information on git clean.


K
Kyle Clegg

Unfortunately neither git rm --cached or git clean -d -fx "" did it for me.

My solution ended up being pushing my branch to remote, cloning a new repo, then doing my merge in the new repo. Other people accessing the repo had to do the same.

Moral of the story: use a .gitignore file from inception.


N
Nakilon

If you want to quickly resolve this question,You can use this command:

git checkout -f dev

This helped me, when my issue was not related to .gitignore afaik.
error: pathspec 'dev' did not match any file(s) known to git.
@Black 'dev' is branch name, put your branch instead
W
Wolfson

I had the same problem when checking out to a branch based on an earlier commit. Git refused to checkout because of untracked files.

I've found a solution and I hope it will help you too.

Adding the affected directories to .gitignore and issuing $ git rm -r --cached on them is apparently not enough.

Assume you want to make a branch based an earlier commit K to test some stuff and come back to the current version. I would do it in the following steps:

Setup the untracked files: edit the .gitignore and apply $ git rm -r --cached on the files and directories you want the git to ignore. Add also the file .gitignore itself to .gitignoreand don't forget to issue $ git rm -r --cached .gitignore. This will ensure the the ignore behavior of git leaves the same in the earlier commits. Commit the changes you just made: $ git add -A $ git commit Save the current log, otherwise you may get problems coming back to the current version $ git log > ../git.log Hard reset to the commit K $ git reset --hard version_k Create a branch based on the commit K $ git branch commit_k_branch Checkout into that branch $ git checkout commit_k_branch Do your stuff and commit it Checkout back into master again $ git checkout master Reset to the current Version again $ git reset current_version or $ git reset ORIG_HEAD Now you can reset hard to the HEAD git reset --hard HEAD

NOTE! Do not skip the next-to-last step (like e. g. $ git reset --hard ORIG_HEAD ) otherwise the untracked files git complained above will get lost.

I also made sure the files git complained about were not deleted. I copied them to a text-file and issued the command $ for i in $(cat ../test.txt); do ls -ahl $i; done

If you checkout to the branch mentioned above again, do not forget to issue $ git status to ensure no unwanted changes appear.


R
Ryan Lundy

This happened to me on a Windows 8 system, using Git from the command prompt. The rest of my team uses TFS, and I use Microsoft's git-tf to push/pull between TFS and my local Git repository.

The problem arose due to some files that had been renamed only to change their case. What appears to have happened was this:

The files were checked in with mixed casing in their names.

In a later commit, the file names were changed to all lower-case.

git-tf initially got the files in mixed case.

When the files were renamed to lower-case, git-tf didn't get the files because to Windows 8 those file names are equivalent.

Since Git is case-sensitive, it complained that I had the mixed-case files that weren't in source control. But using git status, I couldn't see any changes, since in the Windows command prompt those file names are equivalent.

The simplest solution for me was:

git checkout a previous version of the project, well before those files were ever added.

Then git checkout the latest version of the project, with the correct file casing.


+1 I was able to use git log on the current branch and branch to rebase to see when the commit occurred that changed the case; then I hacked around it...
w
wisbucky

In my case, the problem was with the submodules. master was merged with another branch which added a new submodule to the project. The branch I was trying to checkout didn't have it, that's why git was complaining about untracked files and none of the other suggested solutions worked for me. I forced the checkout to my new branch, and pulled master.

git checkout -f my_branch

git pull origin master

git submodule update --init


s
saber tabatabaee yazdi

this commands solved my problem:

git add * 
git stash
git pull

a
applesnort

In my case git rm --cached didn't work. But i got it with a git rebase


S
Sheraz Ahmad Khilji

I was also facing a similar issue and i tried all the solutions posted above but it didn't work

The issue was caused when i renamed my onMusicUpdateListener.java to OnMusicUpdateListener.java in develop branch.

Now master had onMusicUpdateListener.java and develop had the same file as OnMusicUpdateListener.java

Now whenever i switched to master it gave me an error

The following untracked working tree files would be overwritten by checkout

and then it aborted.

In order to solve this, i forcefully checked out master branch and then renamed my onMusicUpdateListener.java to OnMusicUpdateListener.java, committed it and then merged it with develop branch.

Then i updated my develop branch by merging it into master and now everything is back to normal and problem is solved.


I have run into similar issues before. To my understanding, case sensitivity issue seems to be a problem on windows only. I guess you are developing on windows?
W
Wolfson

that's easy to solve, git is saying that you have the same files in both branches, therefore you have to delete the specific files from master branch and then you will be able to merge:

git merge "your branch"

I hope it works for you, I just solved my error. my error was:

error: The following untracked working tree files would be overwritten by merge:
        .vs/slnx.sqlite
Please move or remove them before you merge.
Aborting

Now it is working! In my case .vs/slnx.sqlite was generated by visual studio, I needed to close it before delete it.


I had the same issue with xcode and swiftpm/Package.resolved and this worked for me.
W
Won Jun Bae

This could be a permission issue,

change the ownership,

sudo chown -v -R usr-name:group-name folder-name

I also had the same issue as Won. I added a .gitignore to a folder that was already getting tracked. I deleted the file and then was able to do a git checkout.
S
Skatox

2 files with the same name but different case might be the issue.

You can Delete one on these files or rename it. Ex:

Pdf.html.twig (The GOOD one)

pdf.html.twig (The one I deleted)

g
gmatht

Move files, instead of delete

One way of avoiding deleting files is to move them instead. For example:

cd "`git rev-parse --show-toplevel`"
git checkout 2>&1 | while read f; do [ ! -e "$f" ] || mv "$f" "$f".bak; done

L
Lyuboslav

If you have renamed a file locally and then do a pull, it will display that error message.


How to get over this error in that case? This message also appears when switching branches after changing the case in a file name (MyFile => myfile).
M
Markosaurus

In my case, I was seeing this error because I am using a popular open source CMS and the directory which was causing issues was the uploads directory which the CMS writes to.

So what it was saying is that there are files which you don't have, but which you can't get from versioning.

I'm grabbing all the files from the live site to my local, then I'll check this into the repo in the hope that this fixes the issue.


v
vishnuc156

Delete .gitignore file from appname/gen/ to solve this issue.


P
Phil Carter

I just went to the file system and deleted the file directly, then continued with git checkout and it worked.

I've had the problem occur several times and it may be related to developers doing delete, push, re-add, push or some such thing.


E
Erdinç Çorbacı

Most of the answers consider deleting or removing the files, which is the easy way. But sometimes you don't want to get rid of the local files. But merge with a strategy, so git has solution for this too ;

git merge --strategy=ours master 

B
Black

Just delete the files or rename them.

e.g.

$ git pull
Enter passphrase for key '/c/Users/PC983/.ssh/id_rsa':
error: Your local changes to the following files would be overwritten by merge:
        ajax/productPrice.php
Please commit your changes or stash them before you merge.
error: The following untracked working tree files would be overwritten by merge:
        ajax/product.php
Please move or remove them before you merge.
Aborting
Updating a04cbe7a..6aa8ead5

I had to rename/delete ajax/product.php and ajax/produtPrice.php.

Don't worry, git pull will bring them back. I suggest you to rename them instead of deleting, because you might loose some changes.

If this does not help, then you have to delete the whole Branch and create it again and then do git pull origin remotebranch


M
MöĦämëđ ÏbŗäĦïm

In order to save the modified files and to use the modified content later. I found this error while i try checking out a branch and when trying to rebase. Try Git stash

git stash


C
Codemaker

Check if any folder name having '/' or any special symbol then rename that folders. Then you just clone the repository to another location.


m
mZed

A simple solution might be: Just make sure that you are in the correct working directory in GitBash. That Message occure almost every time if a User tries to merge a directory too high in his folder hierarchy.

Example:

/workspace/git/myBashSourceFolder/myProjectSourcefolder

Scenario: User cloned repo in git-folder he created a new Java Project in Eclipse, imported the cloned repo. Eclipse set myProjectSourceFolder as Source Folder in his local Project. therefore the User entered it in git bash and pushed, pulled and commited his project from there. git syncs therefore myProjectSourceFolder - but has no record in his history for myBashSourceFolder. Therefore a push / pull /merge from myBashSourceFolder will produce the given output, if User tries to sync from there next time, instead of the folder he worked before.

Solution: Enter correct Folder and try a pull again. In almost every time I encountered, this solution worked fine :)