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

时间:2011-02-01 01:39:45

标签: git git-merge gitignore

所以我在.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/*

如何让这个工作,所以我可以切换分支而不删除这些文件?

如果我进行更改,会影响这些文件吗?换句话说,如果我之后回到这个分支,那么一切都是完美的,直到我最近的提交?

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

29 个答案:

答案 0 :(得分:949)

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

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

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

答案 1 :(得分:533)

  

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

强迫它:git checkout -f another-branch

答案 2 :(得分:243)

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

但是你的.gitignore还有另外一个问题,你过度使用通配符并导致它匹配的次数少于预期。相反,我们可以更改.gitignore并尝试此操作。

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

答案 3 :(得分:133)

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

git config core.ignorecase true

答案 4 :(得分:42)

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

可能有一个原因导致您develop分支中的文件,而不是当前分支中的文件。您可能需要询问协作者原因。

  

如何让这个工作,所以我可以切换分支而不删除这些文件?

如果没有让文件以某种方式消失,你就无法做到。您现在可以将public重命名为my_public或其他内容。

  

如果我之后回到这个分支,那么一切都是完美的,直到我最近的提交?

如果您提交更改,Git不会丢失它们。如果您不提交更改,那么Git将非常努力地而不是来覆盖您已完成的工作。这就是Git在这里第一次警告你的事情(当你试图切换分支时)。

答案 5 :(得分:21)

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

git clean -i

然后git pull会这样做。

答案 6 :(得分:19)

这对我有用。

'com.android.support:multidex:1.0.0'

答案 7 :(得分:11)

很遗憾,git rm --cachedgit clean -d -fx ""都没有为我做过。

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

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

答案 8 :(得分:11)

对于那些需要远远不及Scott Schafer’s answer

的人
git clean -f

可能会奏效。我高度建议运行

git clean --dry-run

第一。该命令将输出Git将在您运行git clean -f时删除的文件列表,并可能为您免除无意中删除您不想要的内容的痛苦。

有关git clean的详细信息,请参阅this Stack Oveflow answerthe docs

答案 9 :(得分:9)

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

git checkout -f dev

答案 10 :(得分:8)

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

问题出现是由于某些文件仅为了更改案例而重命名。似乎发生了什么:

  • 使用名称中的混合外壳检入文件。
  • 在稍后的提交中,文件名已更改为全部小写。
  • git-tf最初以大小写混合的方式获取文件。
  • 当文件重命名为小写时,git-tf没有获取文件,因为对于Windows 8,这些文件名是等效的。
  • 由于Git区分大小写,因此抱怨我有不在源代码控制中的混合大小写文件。但是使用git status,我看不到任何更改,因为在Windows命令提示符下,这些文件名是等效的。

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

  • git checkout项目的先前版本在添加这些文件之前
  • 然后 git checkout项目的最新版本,并使用正确的文件框。

答案 11 :(得分:7)

基于之前的提交签出分支时遇到了同样的问题。由于没有跟踪文件,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. 保存当前日志,否则您可能会遇到回到当前版本的问题

    $ 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

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

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

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

答案 12 :(得分:4)

就我而言,问题在于子模块。 master与另一个分支合并,后者为项目添加了一个新的子模块。我试图检查的分支没有它,这就是为什么git抱怨未跟踪的文件而其他任何建议的解决方案都没有为我工作。我强行结帐到我的新分店,拉了主人。

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

答案 13 :(得分:3)

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

当我在onMusicUpdateListener.java分支中重新命名我的OnMusicUpdateListener.javadevelop时,会导致此问题。

现在masteronMusicUpdateListener.javadevelopOnMusicUpdateListener.java

具有相同的文件

现在,每当我切换到掌握时,它都会给我一个错误

The following untracked working tree files would be overwritten by checkout

然后aborted

为了解决这个问题,我强行checked out master分支 然后将onMusicUpdateListener.java重命名为OnMusicUpdateListener.java,将committed重命名为merged,然后将develop重命名为develop分支。

然后我将merging分支master更新为 Calendar calendar = Calendar.getInstance(); calendar.set(0, 0, 0, hourOfDay, minute, 0); long timeInMillis = calendar.getTimeInMillis(); java.text.DateFormat dateFormatter = new SimpleDateFormat("hh:mm a"); Date date = new Date(); date.setTime(timeInMillis); time.setText(dateFormatter.format(date)); ,现在一切恢复正常,问题就解决了。

答案 14 :(得分:3)

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

相反,我实际上删除了文件(在eclipse中),就像Git告诉你的那样; 请先移动或删除它们,然后才能切换分支。

然后我添加/提交它。

然后我拉了它就有效了!

答案 15 :(得分:2)

在我的情况下,git rm --cached无效。 但我得到了git rebase

答案 16 :(得分:2)

移动文件,而不是删除

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

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

答案 17 :(得分:2)

具有相同名称但不同案例的2个文件可能是个问题。

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

Pdf.html.twig (The GOOD one)

pdf.html.twig (The one I deleted)

答案 18 :(得分:2)

这可能是许可问题,

更改所有权

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

答案 19 :(得分:1)

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

答案 20 :(得分:1)

这很容易解决,git说你在两个分支中都有相同的文件,因此你必须从master分支中删除特定的文件,然后你就可以合并了:

git merge“your branch”

我希望它适合你,我刚刚解决了我的错误。 我的错误是:

错误:以下未跟踪的工作树文件将被合并覆盖:         .VS / slnx.sqlite 请在合并前移动或删除它们。 中止

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

答案 21 :(得分:0)

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

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

答案 22 :(得分:0)

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

答案 23 :(得分:0)

在我的情况下,我看到了这个错误,因为我使用的是流行的开源CMS,导致问题的目录是CMS写入的上传目录。

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

我将实时网站上的所有文件抓取到我的本地,然后我会将此检查到回购中,希望这可以解决问题。

答案 24 :(得分:0)

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

git merge --strategy=ours master 

答案 25 :(得分: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.php ajax / produtPrice.php

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

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

答案 26 :(得分:0)

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

git stash

答案 27 :(得分:0)

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

答案 28 :(得分:0)

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

示例:

/workspace/git/myBashSourceFolder/myProjectSourcefolder

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

  

解决方案::输入正确的文件夹,然后再次尝试拉出。在几乎每一个   我遇到的时候,这种解决方案效果很好:)