.gitignore和“以下未跟踪的工作树文件将被签出覆盖”


826

因此,我在.gitignore文件中添加了一个文件夹。

一旦我做了一个git status告诉我

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

但是,当我尝试更改分支时,我得到以下信息:

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

这是我的.gitignore文件的样子:

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

我如何才能正常工作,以便可以在不删除那些文件的情况下切换分支?

如果我进行更改,会影响那些文件吗?换句话说,如果我此后回到该分支,那么就我最近的提交而言,一切都将是完美的吗?

我不想丢失这些文件,只是不想跟踪它们。


10
如果您真的不在乎这些文件:git checkout -f <branch>在我的情况下,文件是在构建过程中生成的,因此我不太关心
Hobbamok

如果您执行“ git checkout”(没有分支名称),则有时会发生。要修复,做“git的结帐BRANCHNAME”
工匠

一个单独的但至关重要的问题:为什么会发生此错误?为什么git不能只在分支之间切换?
ahnbizcad '18

@ahnbizcad因为如果您正在处理一个新文件,而另一个分支上的某个人恰巧提交了一个具有相同名称的文件,那么当git在切换分支时破坏了您的版本时,您会感到恼火。这就是-f标志在那里的原因。
马修·夏普

Answers:


263

似乎您想忽略这些文件,但它们已经被提交。.gitignore对存储库中已存在的文件没有影响,因此需要使用删除git rm --cached。这--cached将防止它对您的工作副本产生任何影响,并且在您下次提交时只会将其标记为已删除。从存储库中删除文件后,.gitignore将阻止它们再次添加。

但是,您的.gitignore遇到另一个问题,您过度使用了通配符,导致通配符匹配的程度比预期的要少。相反,让我们更改.gitignore并尝试一下。

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

2
谢谢...。我从当前分支中删除了所有文件,并进行了备份。然后切换分支并将其放回原处。那行得通。另外,感谢.gitignore的提示
marcamillion

@marcamillion:“有效”是什么意思?如果在您切换到的分支上跟踪了文件,则说明您的版本已将其覆盖,这可能会有所不同...
Cascabel 2011年

1
我遇到了/ build文件夹的问题,不需要跟踪。因此,我删除了本地文件夹,提交了.gitignore文件,然后签出了另一个分支。终于对我有用。
Mike S.

16
我认为第一部分是与此特定错误消息相反的部分。此错误说明用户当前位于一个分支中,该分支没有跟踪那些JPG文件,并且用户正尝试移动到一个分支中。因此,这样做git rm --cached不会造成任何影响,这些文件在当前分支中不存在。对于此错误,我认为用户需要遵循@Greg Hewgill的回答-“将其移出工作副本,切换分支,然后将其移回”。
studgeek

4
一个会如何解决your files would be overwrittenfatal: pathspec 'test/node_modules' did not match any files当我这样做git rm -r --cache test/node_modules?由于覆盖的消息,我无法拉出,因为git找不到它们(它们在那里),因此无法删除
HMR 2015年

1045

警告:它将删除未跟踪的文件,因此对于提出的问题不是一个很好的答案。

我也打了这个信息。就我而言,我不想保留文件,因此这对我有用:

git 2.11及更高版本

git clean  -d  -f .

较旧的git

git clean  -d  -f ""

如果您还想删除git忽略的文件,请执行以下命令。

被警告!!!仅当您知道您正在做的事情的100%时,才可能破坏您的项目

git 2.11及更高版本

git clean  -d  -fx .

较旧的git

git clean  -d  -fx ""

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

  • -x 意味着忽略的文件以及git未知的文件也将被删除。

  • -d 表示除未跟踪文件外,还删除未跟踪目录。

  • -f 需要强制它运行。


7
谢谢,打扫干净之后,我得以改头换面了。
亚历山大·贝莱茨基

139
运行git clean时要小心!
2014年

249
为避免脸部疼痛,请先使用试运行选项运行它,以查看其作用:git clean -dfxngit clean -dfx --dry-run
Dennis

74
哇靠。这将删除我的xcode上的所有配置文件,现在该项目正在变成mac项目。运行此命令时请务必小心。我以为只会从git中删除它。
tyegah123

25
这个-x选择让我很痛
2014年

589

警告:这将删除未建立索引的本地文件

强迫它: git checkout -f another-branch


78
警告:这将删除未建立索引的本地文件。
givanse 2014年

git clean不适用于我,但是力量正是我所需要的。它卡在那个分支上,我只需要它来更改分支。
西蒙猫猫

7
我不希望没有被索引的文件!为您+1
ryansstack 2015年

我收到了这个错误,:(error: pathspec 'mybranch' did not match any file(s) known to git.
Budi Mulyo

2
这是真正的答案。
metamonkey '19

145

如果您使用的是OS X,则可能是因为文件名的某些字符更改了大小写。尝试设置以下配置选项:

git config core.ignorecase true

13
它也可以在Windows上运行,由于情况变化,GIT无法确定,这种情况首先发生是因为
SagiLow 2015年

4
这恰好是我遇到的问题,文件路径只有一个字母的大小写不同-Windows将其视为相同,但GIT不会,这是问题所在。
Daniel Sokolowski

1
我的问题发生在Windows 10的另一个分支的签出中
Sun

太棒了!当我在标签之间移动时,这解决了我的问题
WilliamAñez17年

1
如果您也尝试git rebase也可以。谢谢。
user3890355 '18

42

Git告诉您它想创建文件(命名public/system/images/9/...等),但是您已经在该目录中拥有了Git 不会跟踪的现有文件。也许有人将这些文件添加到Git存储库,这是您第一次切换到该分支吗?

这些文件可能在您的develop分支中而不在当前分支中,这可能是一个原因。您可能必须问您的合作者为什么。

我该如何工作,以便我可以切换分支而不删除那些文件?

如果不以某种方式使文件消失,就无法做到。您现在可以重命名publicmy_public或其他名称。

如果之后我回到该分支机构,那么到我最近提交时,一切都将是完美的吗?

如果您提交更改,Git不会丢失它们。如果您不提交更改,那么Git将尽力覆盖已完成的工作。这就是Git在这里首先警告您的内容(当您尝试切换分支时)。


感谢您的解释。我备份了文件,切换了分支并合并了它们,然后替换了公用文件夹中的文件。那行得通。
marcamillion

1
当我评论@Arrowmaster的答案时。这是错误消息的正确答案。对于这位特别发问的人来说,这可能不是正确的答案,因为他的真正问题似乎就是他的不义之徒。
studgeek

37

这对我有用。

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

5
请在您的解决方案上添加说明。请参阅stackoverflow.com/help/how-to-answer
user7294900

这是我的看法。远程分支的本地副本实际上以某种方式具有所有未跟踪的文件。您正在检查以恢复其最初抱怨的未跟踪文件。现在您可以切换到其他分支机构
ahnbizcad '18八月

2
由于某种原因,这是我唯一的可行解决方案。谢了哥们。
Kiwad

解决了我的问题。谢谢
Devashis Kant

非常感谢,如此简单!git reset --soft origin / develop。我讨厌这些合并冲突编辑。这个命令非常好用和简单。
nine9five



12

不幸的是git rm --cachedgit clean -d -fx ""没有为我做。

我的解决方案最终是将分支推到远程,克隆了一个新的存储库,然后在新的存储库中进行了合并。其他访问回购协议的人也必须这样做。

故事的寓意:.gitignore从一开始就使用文件。


10

如果要快速解决此问题,可以使用以下命令:

git checkout -f dev

当我的问题与.gitignoreafaik 无关时,这对我有所帮助。
纳基隆

错误:pathspec'dev'与git已知的任何文件都不匹配。
黑色的

@Black'dev'是分支名称,请改用您的分支
Vinit Solanki

8

基于较早的提交签出到分支时,我遇到了同样的问题。Git由于未跟踪文件而拒绝检出。

我已经找到了解决方案,希望对您有帮助。

将受影响的目录添加到它们.gitignore$ git rm -r --cached在其上发布显然是不够的。

假设您想基于较早的提交K创建分支,以测试某些内容并返回到当前版本。我会按照以下步骤进行操作:

  1. 设置未跟踪的文件:编辑.gitignore并应用$ git rm -r --cached到您希望git忽略的文件和目录上。也将文件.gitignore本身添加到其中.gitignore,不要忘记发出$ git rm -r --cached .gitignore。这将确保git的ignore行为在早期的提交中保持不变。

  2. 提交刚才所做的更改:

    $ git add -A
    $ git commit

  3. 保存当前日志,否则返回到当前版本时可能会遇到问题

    $ git log > ../git.log

  4. 硬重置为提交K

    $ git reset --hard version_k

  5. 根据提交K创建分支

    $ git branch commit_k_branch

  6. 结帐到该分支

    $ git checkout commit_k_branch

  7. 做你的东西并提交

  8. 再次结帐回主人

    $ git checkout master

  9. 再次重置为当前版本

    $ git reset current_version 要么 $ git reset ORIG_HEAD

  10. 现在您可以重设HEAD

    git reset --hard HEAD

注意!不要跳过倒数第二个步骤(例如$ git reset --hard ORIG_HEAD ),否则上面抱怨的未跟踪文件git将会丢失。

我还确保git抱怨的文件没有被删除。我将它们复制到文本文件并发出命令$ for i in $(cat ../test.txt); do ls -ahl $i; done

如果再次签出上述分支,请不要忘记发出$ git status以确保不会出现不需要的更改。


8

Windows 8系统上,这是我在命令提示符下使用Git发生的。我团队的其余成员使用TFS,而我使用Microsoft的 git-tf在TFS和本地Git存储库之间推/拉。

由于某些文件只是为了更改大小写而被重命名,因此出现了问题。发生的事情似乎是这样的:

  • 这些文件的名称以混合大小写形式签入。
  • 在以后的提交中,文件名更改为全部小写。
  • git-tf最初使用大小写混合的文件。
  • 将文件重命名为小写时,git-tf没有得到文件,因为在Windows 8中,这些文件名是等效的。
  • 由于Git区分大小写,因此它抱怨我的混合大小写文件不在源代码管理中。但是使用时git status,我看不到任何更改,因为在Windows命令提示符下,这些文件名是等效的。

对我来说,最简单的解决方案是:

  • git checkout项目的先前版本早于添加这些文件之前
  • 然后git checkout项目的最新版本,并带有正确的文件大小写。

+1我能够在当前分支和分支上使用git log进行变基,以查看何时发生了更改情况的提交;然后我在周围乱砍...
sage 2016年

4

这两个函数(git rm --cached,git checkout -f another-branch)对我不起作用。

取而代之的是,我按照Git的指示实际删除了文件(在Eclipse中)。 请先移动或移除它们,然后才能切换分支。

然后我添加/提交了它。

然后我拉开了,它起作用了!


4

就我而言,问题出在子模块上。master与另一个分支合并,该分支向项目添加了新的子模块。我尝试签出的分支没有该分支,这就是git抱怨未跟踪文件的原因,而其他建议的解决方案都对我无效。我强迫结帐到我的新分支,并拉了主人。

  • git checkout -f my_branch
  • git pull origin master
  • git submodule update --init

3

就我而言,git rm --cached这没有用。但是我有一个git rebase


3

我也遇到了类似的问题,我尝试了上面发布的所有解决方案,但没有用

当我在分支中将我重命名为时onMusicUpdateListener.java,导致了该问题。OnMusicUpdateListener.javadevelop

现在master具有onMusicUpdateListener.javadevelop具有相同的文件OnMusicUpdateListener.java

现在,每当我转为精通时,都会给我一个错误

The following untracked working tree files would be overwritten by checkout

然后aborted

为了解决这个问题,我强行checked out master分支,然后将其重命名onMusicUpdateListener.javaOnMusicUpdateListener.javacommitted然后再将merged其命名为developbranch。

然后我develop通过merging它更新了我的分支master,现在一切恢复正常并解决了问题。


我以前也遇到过类似的问题。据我了解,区分大小写问题似乎仅在Windows上是一个问题。我猜你在Windows上进行开发?
Ji_in_coding

2

这可能是权限问题,

更改所有权,

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

我也遇到了与韩元相同的问题。我向已被跟踪的文件夹中添加了.gitignore。我删除了文件,然后能够进行git checkout。
cbloss793 '16

2

2个名称相同但大小写不同的文件可能是问题所在。

您可以删除这些文件中的一个或重命名。例如:

Pdf.html.twig (The GOOD one)

pdf.html.twig (The one I deleted)

2

移动文件,而不是删除

避免删除文件的一种方法是移动文件。例如:

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

1

如果您已经在本地重命名了文件,然后执行pull,它将显示该错误消息。


在那种情况下如何克服这个错误?在更改文件名的大小写(MyFile => myfile)后切换分支时,也会出现此消息。
BernhardDöbler'17

1

这很容易解决,git表示两个分支中都有相同的文件,因此必须从master分支中删除特定文件,然后才能合并:

git merge“您的分支”

希望它对您有用,我刚刚解决了我的错误。我的错误是:

错误:合并后,以下未跟踪的工作树文件将被覆盖:.vs / slnx.sqlite请在合并之前移动或删除它们。堕胎

现在可以了!在我的情况下,.vs / slnx.sqlite由Visual Studio生成,我需要先关闭它,然后再删除它。


0

就我而言,我看到此错误是因为我正在使用流行的开源CMS,而引起问题的目录是CMS写入的上载目录。

所以说的是有些文件没有,但是您无法从版本控制中获取。

我要从实时站点抓取所有文件到本地,然后将其检入到存储库中,以期解决此问题。


0

appname / gen /中删除.gitignore文件以解决此问题。


0

我只是去了文件系统并直接删除了文件,然后继续进行git checkout并成功了。

我已经多次发生该问题,它可能与开发人员执行删除,推送,重新添加,推送或类似操作有关。


0

大多数答案都考虑删除或删除文件,这是简单的方法。但是有时候您不想摆脱本地文件。但是合并策略,因此git也有解决方案;

git merge --strategy=ours master 

0

只需删除文件或重命名它们即可。

例如

$ 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

我不得不重命名/删除ajax / product.phpajax / produtPrice.php

不用担心,git pull会把它们带回来。我建议您重命名它们而不是删除它们,因为您可能会丢失一些更改。

如果这样做没有帮助,则必须删除整个分支并再次创建它,然后再执行 git pull origin remotebranch


0

为了保存修改后的文件并在以后使用修改后的内容。我在尝试签出分支以及尝试重新设置基准时发现了此错误。尝试Git隐藏

git stash


0

检查是否有带有“ /”或任何特殊符号的文件夹名称,然后重命名该文件夹。然后,您只需将存储库克隆到另一个位置。


0

一个简单的解决方案可能是:只需确保您在以下目录中的正确工作目录中即可 GitBash。如果用户尝试将目录合并到其文件夹层次结构中太高的目录,则几乎每次都会出现该消息。

例:

/workspace/git/myBashSourceFolder/myProjectSourcefolder

场景:用户克隆的仓库在git-folderEclipse中创建了一个新的Java项目,并导入了克隆的仓库。Eclipse在其本地项目中将myProjectSourceFolder设置为Source Folder。因此,用户使用git bash输入了它,然后从那里推,拉并提交了他的项目。git因此同步myProjectSourceFolder-但在他的历史记录中没有myBashSourceFolder的记录。因此,如果用户下次尝试从那里进行同步,则myBashSourceFolder的push / pull / merge将产生给定的输出,而不是以前工作的文件夹。

解决方案:输入正确的文件夹,然后再次尝试拉。在几乎每次遇到的情况下,此解决方案都很好:)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.