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

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

一旦我做了git status它告诉我

# On branch latestnothing to commit (working directory clean)

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

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

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

.bundle.DS_Storedb/*.sqlite3log/*.logtmp/**/*public/system/images/*public/system/avatars/*

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

如果我做了更改,它会影响这些文件吗?换句话说,如果我之后回到这个分支,在我最近的提交之前,一切都会完美吗?

我不想失去这些文件,我只是不想让他们被跟踪。

1412583 次浏览

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

这些文件在您的develop分支中而不在您当前的分支中可能是有原因的。您可能需要询问您的合作者为什么会这样。

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

如果不以某种方式使文件消失,您就无法做到这一点。您现在可以将public重命名为my_public或其他名称。

如果我后来回到这个分支,一切都会像我最近的承诺一样完美吗?

如果您提交更改,Git不会丢失它们。如果您不提交更改,那么Git将非常努力地没有覆盖您所做的工作。这就是Git在第一个实例中警告您的(当您尝试切换分支时)。

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

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

.bundle.DS_Storedb/*.sqlite3log/*.logtmp/public/system/images/public/system/avatars/

警告:它会删除未跟踪的文件,所以这不是对所提出问题的好答案。

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

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需要强制它运行。

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

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

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

假设你想制作一个基于早期提交K的分支来测试一些东西并回到当前版本。我会按照以下步骤完成:

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

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

    $ git add -A$ git commit
  3. Save the current log, otherwise you may get problems coming back to the current version

    $ git log > ../git.log

  4. Hard reset to the commit K

    $ git reset --hard version_k

  5. Create a branch based on the commit K

    $ git branch commit_k_branch

  6. Checkout into that branch

    $ git checkout commit_k_branch

  7. Do your stuff and commit it

  8. Checkout back into master again

    $ git checkout master

  9. Reset to the current Version again

    $ git reset current_version or $ git reset ORIG_HEAD

  10. 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.

在我的情况下git rm --cached不起作用。但是我用git rebase得到了它

不幸的是,无论是git rm --cached还是git clean -d -fx ""都没有为我做到这一点。

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

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

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

只是强迫它:git checkout -f another-branch

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

git config core.ignorecase true

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

问题是由于一些重命名的文件只是为了改变他们的案子引起的。似乎发生了这样的事情:

  • 这些文件是用他们名字中的混合套管签入的。
  • 在以后的提交中,文件名更改为所有小写。
  • git-tf最初以混合大小写获得文件。
  • 当文件重命名为小写时,git-tf没有获取文件,因为对于Windows 8来说,这些文件名是等效的。
  • 由于Git区分大小写,它抱怨我有不在源代码控制中的混合大小写文件。但是使用git status,我看不到任何变化,因为在Windows命令提示符中,这些文件名是等效的。

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

  • #0以前的版本的项目,早在这些文件被添加之前
  • 然后#0最新版本的项目,用正确的文件套管。

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

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

我从实时站点抓取所有文件到我的本地,然后我将把它签入存储库,希望这能解决问题。

这可能是一个许可问题,

改变所有权,

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

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

这个问题是在我develop分支中的onMusicUpdateListener.javaOnMusicUpdateListener.java时引起的。

现在master有了onMusicUpdateListener.javadevelopOnMusicUpdateListener.java有相同的文件

现在每当我切换到主它给我一个错误

The following untracked working tree files would be overwritten by checkout

然后它aborted

为了解决这个问题,我强行checked outmaster分支然后将我的onMusicUpdateListener.java重命名为OnMusicUpdateListener.javacommitted它,然后merged它与develop分支。

然后我将我的develop分支更新为mergingmaster,现在一切都恢复正常,问题得到解决。

应用名称中删除. gitignore文件以解决此问题。

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

git checkout -f dev

有一个命令用于这个微妙的任务(永久删除未跟踪的文件)

git clean -i

git pull就可以了。

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

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

Pdf.html.twig (The GOOD one)
pdf.html.twig (The one I deleted)

这两个功能

  1. git rm --cached
  2. git checkout -f another-branch

没有为我工作。

相反,我按照Git告诉你的方式物理删除了文件(在eclipse中);

Please move or remove them before you can switch branches.

然后我添加/提交它。

然后我拉,它工作!

移动文件,而不是删除

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

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

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

我只是去了文件系统并直接删除了文件,然后继续使用git签出,它起作用了。

我已经多次出现这个问题,它可能与开发人员进行删除、推送、重新添加、推送或类似的事情有关。

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

git merge "your branch"

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

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

现在它正在工作!在我的情况下.vs/slnx.sqlite是由Visual Studio生成的,我需要在删除它之前关闭它。

这对我有用。

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

就我而言,问题出在子模块上。master与另一个分支合并,该分支向项目添加了一个新的子模块。我试图签出的分支没有它,这就是为什么git抱怨未跟踪的文件,其他建议的解决方案都不适合我。我强制签出到我的新分支,并拉取了master。

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

对于那些需要比Scott Schafer的回答更少的东西的人来说,

git clean -f

可能会奏效。我建议跑步

git clean --dry-run

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

有关git clean的更多信息,请参阅这个堆栈Oveflow答案的文档

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

git merge --strategy=ours master

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

e. g.

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

我不得不重命名/删除Ajax/product.phpAjax/produtPrice.php

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

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

为了保存修改后的文件并稍后使用修改后的内容。我发现这个错误,而我尝试签出一个分支,并试图重新建立基础。试试Git stash

git stash

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

一个简单的解决方案可能是:只需确保您在GitBash中的正确工作目录中。如果用户试图在他的文件夹层次结构中合并太高的目录,几乎每次都会发生该消息。

示例:

/workspace/git/myBashSourceFolder/myProjectSourcefolder

场景:用户在git-folder中克隆了存储库,他在Eclipse中创建了一个新的Java项目,导入了克隆的存储库。Eclipse将myProjectSourceFolder设置为本地项目中的源文件夹。因此,用户在git bash中输入它,并从那里推送、拉取和提交他的项目。git同步因此myProjectSourceFolder-但在他的myBashSourceFolder历史记录中没有记录。因此,如果用户下次尝试从那里同步,从myBashSourceFolder /merge的推/拉将产生给定的输出,而不是他以前工作的文件夹。

解决方案:输入正确的文件夹并再次尝试拉取。在几乎每个我遇到的时候,这个解决方案工作得很好:)

这个命令解决了我的问题:

git add *git stashgit pull

在我的情况下,问题是由于文件名从subscribe.ts更改为Subscribe.ts

所以我检查了我的分支dev是否与我所在的当前分支main保持同步。

(当前分支主要

  1. git merge dev

    >已经更新了

  2. git branch -d dev

  3. git checkout -b dev