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

mar*_*ion 796 git gitignore git-merge

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

一旦我做了git status它告诉我

# On branch latest
nothing to commit (working directory clean)
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

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

.bundle
.DS_Store
db/*.sqlite3
log/*.log
tmp/**/*
public/system/images/*
public/system/avatars/*
Run Code Online (Sandbox Code Playgroud)

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

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

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

小智 1003

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

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

git 2.11和更新

git clean  -d  -f .
Run Code Online (Sandbox Code Playgroud)

老吉他

git clean  -d  -f ""
Run Code Online (Sandbox Code Playgroud)

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

被警告!!!如果您知道100%做什么,这最可能会破坏您的项目

git 2.11和更新

git clean  -d  -fx .
Run Code Online (Sandbox Code Playgroud)

老吉他

git clean  -d  -fx ""
Run Code Online (Sandbox Code Playgroud)

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

  • -x 表示被删除的文件也被删除以及git未知的文件.

  • -d 表示除了未跟踪的文件之外删除未跟踪的目录.

  • -f 需要强制它运行.

  • 为了避免使用facepalm,首先使用dry-run选项运行它以查看它将执行的操作:`git clean -dfxn`或`git clean -dfx --dry-run` (245认同)
  • 运行git干净时要小心! (136认同)
  • 碉堡了。这会删除我的 xcode 上的所有配置文件,现在该项目正在变成 mac 项目。运行此命令时要非常小心。我认为它只会从 git 中删除它。 (70认同)
  • `-x`选项伤害了我 (24认同)
  • 谢谢,在那之后,我能够改变; (7认同)
  • 为什么此命令上没有BIG RED DANGER标志 (6认同)
  • 这删除了所有我的LAVAVEL供应商目录.请小心点 (6认同)
  • 如何撤消此命令?我删除了一些重要文件...... :( (4认同)
  • 是的,我们应该在命令之前移动粗体文本.我刚刚删除了我的sqlite数据库.有我所有的早期采用者.. (4认同)
  • 正如其他人所说,在运行此功能时要非常小心,因为它会删除工作目录中未被Git取消的所有文件(例如Capistrano项目中的'shared'文件夹或机器特定的配置文件).首先运行``git clean -dfxn``查看哪些文件会受到影响.*轻轻地哭泣* (3认同)
  • +1 - 甚至没有意识到我的静态媒体目录的一半被 Git 缓存了 (2认同)
  • 在命令之前移动粗体文本.让它眨眼. (2认同)
  • 有人可以删除这个答案吗? (2认同)
  • 好的,这个命令很危险,你能不能把“警告”放大一点 (2认同)

Rég*_*gis 563

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

强迫它: git checkout -f another-branch

  • 警告:这将删除未编制索引的本地文件. (76认同)
  • 我不想要没有编入索引的文件!为你+1 (6认同)
  • 这是真正的答案。 (3认同)

Arr*_*ter 256

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

但是你的.gitignore有另外一个问题,你过度使用通配符并导致它匹配的次数少于预期.而是让我们改变.gitignore并试试这个.

.bundle
.DS_Store
db/*.sqlite3
log/*.log
tmp/
public/system/images/
public/system/avatars/
Run Code Online (Sandbox Code Playgroud)

  • 我认为第一部分是针对此特定错误消息的反向.此错误表明用户当前处于未跟踪这些JPG文件的分支中,并且用户正在尝试移动到那个.所以做```git rm --cached```没有什么区别,那些文件在当前分支中不存在.对于这个错误,我认为用户需要关注@Greg Hewgill的回答 - "将它们从工作副本中移出,切换分支,并将其移回". (15认同)
  • 当我执行`git rm -r --cache test/node_modules`时,如何解决`你的文件将被覆盖``fatal:pathspec'test/node_modules'与任何文件都不匹配?由于覆盖的消息我无法拉,因为git无法找到它们而无法删除(它们在那里) (4认同)
  • 谢谢....我删除了当前分支中的所有文件并备份它们.然后切换分支并将它们放回去.那很有效.另外,感谢.gitignore上的提示 (2认同)

mat*_*sta 138

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

git config core.ignorecase true
Run Code Online (Sandbox Code Playgroud)

  • 它也适用于Windows,看起来这种情况首先发生,因为GIT无法确定的案例更改 (12认同)
  • 这正是我遇到的问题,文件路径因一个字母大小写而不同 - Windows将其视为相同,但GIT并不是问题所在. (3认同)
  • 如果你也尝试 `git rebase`,它也可以工作。谢谢。 (3认同)

Gre*_*ill 42

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

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

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

如果不使文件以某种方式消失,你就无法做到.你现在可以重命名publicmy_public或者什么.

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

如果您提交更改,Git不会丢失它们.如果你没有提交你的更改,那么Git会非常努力地不要覆盖你所做的工作.这就是Git在这里第一次警告你的事情(当你试图切换分支时).

  • 正如我对@Arrowmaster 的回答发表评论的那样。这是错误消息的正确答案。对于这个特别的提问者来说,这可能不是正确的答案,因为他真正的问题似乎是他的 gitignore。 (2认同)

小智 29

这对我有用.

 1. git fetch --all
 2. git reset --hard origin/{branch_name}
Run Code Online (Sandbox Code Playgroud)

  • 请为您的解决方案添加说明.请参阅https://stackoverflow.com/help/how-to-answer (4认同)
  • 出于某种原因,这对我来说是唯一可行的解​​决方案。谢了哥们。 (2认同)

Abh*_*oel 22

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

git clean -i
Run Code Online (Sandbox Code Playgroud)

然后git pull会做.


In-*_*ung 13

这两个函数

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

没有为我工作。

相反,我按照 Git 告诉您的操作(在 Eclipse 中)物理删除了该文件;

Please move or remove them before you can switch branches.
Run Code Online (Sandbox Code Playgroud)

然后我添加/提交它。

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


sab*_*zdi 13

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

git add * 
git stash
git pull
Run Code Online (Sandbox Code Playgroud)

  • 然后你可以执行“git stash apply”或“git stash pop” (2认同)

Kyl*_*egg 12

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

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

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


mc_*_*ser 12

对于那些需要比Scott Schafer的回答不那么深远的人来说,

git clean -f
Run Code Online (Sandbox Code Playgroud)

可能会奏效.我强烈建议跑步

git clean --dry-run
Run Code Online (Sandbox Code Playgroud)

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

有关详细信息,请参阅此Stack Oveflow答案文档git clean.


Gee*_*des 9

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

git checkout -f dev
Run Code Online (Sandbox Code Playgroud)


Jur*_*son 8

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

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

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

假设你想根据早期的提交K创建一个分支来测试一些东西并回到当前版本.我会按以下步骤进行:

  1. 设置未跟踪的文件:编辑.gitignore并应用$ git rm -r --cached您希望git忽略的文件和目录.添加文件.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

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

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

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


Rya*_*ndy 8

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

问题出现是由于一些文件已经重命名只是为了改变他们的情况.似乎发生了什么是这样的:

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

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

  • git checkout该项目的先前版本,远在这些文件被添加之前.
  • 然后git checkout项目的最新版本,具有正确的文件框.


小智 5

就我而言,问题出在子模块上。master与另一个分支合并,为项目添加了一个新的子模块。我试图结帐的分支没有它,这就是为什么 git 抱怨未跟踪的文件并且没有其他建议的解决方案对我有用。我强迫结帐到我的新分支,并拉了主人。

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