关于git:gitignore和”签出将覆盖以下未跟踪的工作树文件”

gitignore and “The following untracked working tree files would be overwritten by checkout”

所以我在.gitignore文件中添加了一个文件夹。

一旦我做了一个git status,它就会告诉我

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
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文件如下所示:

1
2
3
4
5
6
7
.bundle
.DS_Store
db/*.sqlite3
log/*.log
tmp/**/*
public/system/images/*
public/system/avatars/*

我如何才能使这个工作,这样我就可以在不删除这些文件的情况下切换分支?

如果我做了更改,它会影响那些文件吗?换言之,如果我后来回到这个分支,所有的事情都会和我最近的承诺一样完美吗?

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


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

我也点击了这个信息。在我的情况下,我不想保留这些文件,所以这对我很有用:

Git 2.11及更高版本

1
git clean  -d  -f .

老Git

1
git clean  -d  -f""

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

被警告!!!!这很可能会破坏您的项目,仅当您100%知道自己在做什么时才使用。Git 2.11及更高版本

1
git clean  -d  -fx .

老Git

1
git clean  -d  -fx""

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

  • -x意味着忽略的文件也会被删除,以及git不知道的文件。

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

  • 要求-f强制运行。


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

强制执行:git checkout -f another-branch


似乎您希望忽略这些文件,但它们已被提交。.gitignore对已在回购中的文件没有影响,因此需要使用git rm --cached删除它们。--cached将阻止它对您的工作副本产生任何影响,它将在您下次提交时标记为已删除。从repo中删除文件后,.gitignore将阻止再次添加这些文件。

但是你的.gitignore还有另一个问题,你过度使用通配符,导致它的匹配比你期望的要少。改为更改.gitignore并尝试此操作。

1
2
3
4
5
6
7
.bundle
.DS_Store
db/*.sqlite3
log/*.log
tmp/
public/system/images/
public/system/avatars/


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

1
git config core.ignorecase true


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

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

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

你不能不让文件消失就这么做。你现在可以把public改名为my_public或者其他什么。

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

如果您提交更改,Git不会丢失它们。如果您不提交您的更改,那么Git将努力避免覆盖您所做的工作。这就是Git在这里第一次警告您的(当您尝试切换分支时)。


有一个命令可以执行这个微妙的任务(永久删除未跟踪的文件)

1
git clean -i

那么以东十一〔十八〕就可以了。


这对我有用。

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


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

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

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


对于那些需要比斯科特·谢弗的答案更不深远的东西的人,

1
git clean -f

可能有效。我强烈建议跑步

1
git clean --dry-run

第一。该命令将输出一个文件列表,如果您运行git clean -f,Git将删除该列表,并且可能会省去无意中删除不想删除的内容的痛苦。

有关git clean的更多信息,请参阅此Stack OveFlow应答或文档。


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

1
git checkout -f dev


在Windows8系统上,我在命令提示符下使用git时发生了这种情况。我的其他团队使用TFS,我使用Microsoft的git tf在TFS和本地git存储库之间推/拉。

这个问题是由于一些文件被重新命名只是为了改变它们的情况。似乎是这样的:

  • 文件以混合大小写的形式签入。
  • 在稍后的提交中,文件名更改为所有小写。
  • gittf最初得到的文件是混合大小写的。
  • 当文件被重命名为小写时,gittf没有得到这些文件,因为对于Windows8,这些文件名是等效的。
  • 因为Git是区分大小写的,所以它抱怨我有不在源代码管理中的混合大小写文件。但是使用git status,我看不到任何更改,因为在windows命令提示符中,这些文件名是等效的。

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

  • git checkout是该项目的早期版本,早在添加这些文件之前。
  • 然后是git checkout最新版本的项目,具有正确的文件大小写。


在基于先前提交的分支进行签出时,我遇到了同样的问题。由于文件未跟踪,Git拒绝签出。

我找到了一个解决办法,希望它也能帮助你。

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

假设您想让一个基于分支的提交k测试一些东西并返回到当前版本。我将按以下步骤进行:

  • 设置未跟踪文件:编辑.gitignore并在您希望git忽略的文件和目录上应用$ git rm -r --cached。同时将文件.gitignore本身添加到.gitignore中,不要忘记发布$ git rm -r --cached .gitignore。这将确保Git的忽略行为在前面的提交中保持不变。

  • 提交刚才所做的更改:

    $ git add -A
    $ git commit

  • 保存当前日志,否则返回当前版本时可能会出现问题。

    $ git log > ../git.log

  • 硬重置为提交k

    $ git reset --hard version_k

  • 基于提交k创建分支

    $ git branch commit_k_branch

  • 到那家分行结帐

    $ git checkout commit_k_branch

  • 做你的事情并承诺

  • 再次签回主服务器

    $ git checkout master

  • 再次重置为当前版本

    $ git reset current_version$ git reset ORIG_HEAD

  • 现在你可以硬着头复位了

    git reset --hard HEAD

  • 注意!不要跳过下一步到最后一步(如$ git reset --hard ORIG_HEAD))否则,上面抱怨的未跟踪文件会丢失。

    我还确保Git抱怨的文件没有被删除。我把它们复制到一个文本文件中,然后发出命令$ for i in $(cat ../test.txt); do ls -ahl $i; done

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


    在我的例子中,问题出在子模块上。master与另一个分支合并,该分支为项目添加了新的子模块。我尝试签出的分支没有它,这就是为什么Git抱怨未跟踪的文件,其他建议的解决方案都不适用于我。我强迫结账到我的新分行,并拉主人。

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

    我也面临着类似的问题,我尝试了上面所有的解决方案,但都不起作用。

    这个问题是我在develop分公司把我的onMusicUpdateListener.java更名为onMusicUpdateListener.java时引起的。

    现在master有了onMusicUpdateListener.java。而developonMusicUpdateListener.java具有相同的文件。

    现在每当我转向大师,它都会给我一个错误。

    1
    The following untracked working tree files would be overwritten by checkout

    然后是1号[7号]。

    为了解决这一问题,我强行将checked outmaster分公司然后把我的onMusicUpdateListener.java改为onMusicUpdateListener.javacommitted改为merged改为develop分公司。

    然后我用merging把我的develop分支更新到master中,现在一切恢复正常,问题解决了。


    这两个函数(git rm——缓存的,git checkout-f另一个分支)不适用于我。

    相反,我实际删除了文件(在Eclipse中),正如Git告诉您要做的那样;请在切换分支之前移动或删除它们。

    然后我添加/提交它。

    然后我拉了一下,它开始工作了!


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

    您可以删除这些文件中的一个或重命名它。前任:

    1
    2
    3
    Pdf.html.twig (The GOOD one)

    pdf.html.twig (The one I deleted)

    移动文件,而不是删除

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

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

    这可能是许可问题,

    改变所有权,

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


    在我的例子中,git rm --cached不起作用。但我是用一个git rebase买的


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


    这很容易解决,Git说在两个分支中有相同的文件,因此必须从主分支中删除特定的文件,然后才能合并:

    Git合并"你的分支"

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

    错误:以下未跟踪的工作树文件将被合并覆盖:VS/SLNX.QLITE合并前请移动或删除它们。流产

    现在开始工作了!在我的例子中,.vs/slnx.sqlite是由Visual Studio生成的,我需要在删除它之前关闭它。


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

    例如

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $ 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.php和ajax/produtprice.php。

    别担心,Git Pull会带他们回来的。我建议您重命名它们,而不是删除它们,因为您可能会丢失一些更改。

    如果这不起作用,那么您必须删除整个分支并重新创建它,然后执行git pull origin remotebranch


    大多数答案都考虑删除或删除文件,这是一种简单的方法。但有时你不想删除本地文件。但与策略合并,所以Git也有解决方案;

    1
    git merge --strategy=ours master

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


    在我的例子中,我看到这个错误是因为我使用了一个流行的开源CMS,导致问题的目录是CMS写入的上载目录。

    所以它所说的是,有些文件是你没有的,但是你不能从版本控制中得到的。

    我将把所有的文件从现场抓取到本地,然后我将把这些文件签入repo,希望这样可以解决问题。


    以便保存修改的文件并在以后使用修改的内容。我在尝试签出分支和尝试重新平衡时发现此错误。尝试Git Stash

    git stash


    我刚进入文件系统,直接删除了文件,然后继续使用git签出,它工作正常。

    我已经多次遇到这个问题,可能与执行删除、推送、重新添加、推送等操作的开发人员有关。