.gitignore文件在Sourcetree中不起作用


69

我正在做一个Maven项目,我想忽略生成并存储在项目(Evaluation)根文件夹的/ target文件夹中的文件。在git存储库的根目录下,我有一个.gitignore文件,其中包含以下条目(后端只是一个包含Eclipse项目评估的文件夹)

backend/Evaluation/logs/
backend/Evaluation/target/

出于某种原因,SourceTree不会忽略存储在这两个文件夹中的文件,并且在编译项目时,存在一些未提交的更改,即/ target文件夹中的某些.class文件。

为什么会这样呢?我也尝试将.gitignore条目更改为

/后端/评估/日志/ **

但它也不起作用。

有任何想法吗 ?


有一个尾随的摔得痛?backend/Evaluation/logs/*
Lindsay Winkler 2014年

9
还要注意,Git不会忽略已经添加到存储库中的文件。如果git提醒您有关这些文件的未提交更改,则您先前已将它们添加到存储库中。
larsks 2014年

@larsks,因此如何从存储库或整个文件夹中删除这些文件。
SteveSt'2

Answers:


101

假设我们有一个文件无意中添加到我们的存储库中:

stackoverflow$ echo this file is important > junkfile
stackoverflow$ git add junkfile
stackoverflow$ git ci -m 'added a file'

在某个时候,我们意识到该文件并不重要,因此我们将其添加到我们的.gitignore文件中:

stackoverflow$ echo junkfile >> .gitignore
stackoverflow$ git ci -m 'ignore junkfile' .gitignore

稍后,我们对该文件进行一些更改:

stackoverflow$ sed -i 's/ is / is not/' junkfile 

当然,即使该文件在中列出.gitignore,我们也已经告诉git我们要跟踪它,因此git status显示:

stackoverflow$ git status
# On branch master
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   junkfile
#
no changes added to commit (use "git add" and/or "git commit -a")

我们需要从存储库中删除此文件(而无需从工作树中删除文件)。我们可以使用以下--cached标志来做到这一点git rm

stackoverflow$ git rm --cached junkfile
rm 'junkfile'

这将分阶段进行delete操作...

stackoverflow$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   deleted:    junkfile
#

...所以我们需要提交:

stackoverflow$ git commit -m 'removed junkfile from repository'
[master 19f082a] removed junkfile from repository
 1 file changed, 1 deletion(-)
 delete mode 100644 junkfile

现在,如果我们运行git statusgit,将忽略此文件:

stackoverflow$ git status
# On branch master
nothing to commit, working directory clean

即使它仍在我们的工作树中:

stackoverflow$ cat junkfile 
this file is not important

3
漂亮而精致的答案,但需要使用命令行而不是SourceTree
Ibrahim Dauda

129

因为问题中包含Sourcetree标签,所以我将回答您如何使用Sourcetree做到这一点,这非常简单。

如前所述,您首先必须从跟踪中删除文件,然后使Sourcetree忽略该文件。

  1. 更改文件中的内容,以便显示给您,或者从打开的存储库底部的“文件状态”选项卡中选择它。
  2. 右键单击该文件,您会看到“忽略...”,但该文件显示为灰色,因为如上所述,该文件已经在跟踪中了。
  3. 右键单击该文件,然后选择“停止跟踪”
  4. 该文件将显示一个红色按钮,指示该文件将被删除(已从跟踪中删除)
  5. 同一文件的新条目将在“文件状态”中显示,带有蓝色问号表示新文件(新,因为您在4中表示从跟踪中删除)
  6. 右键单击5中的文件,现在您可以选择“忽略...”。单击它,Sourcetree将在.gitignore文件中为该文件添加一个新条目。
  7. 如果单击右上角的“设置”,选择“高级”,则可以看到.gitignore文件,然后第一个条目与忽略文件有关,单击“编辑”,它将打开。

7
对SourceTree的回答很好。并非所有人都使用命令行。
Ibrahim Dauda

8
请注意,如果您在单击“停止跟踪”之前手动尝试将文件添加到.gitignore文件,则第5步将无法执行。这些文件将不会显示在您的存储库中,因为它们已被正确忽略。
user63457 2013年

我该如何为sourcetree中的文件夹执行此操作?
维克拉姆

11

我在跟踪bin文件夹(整个文件夹)时遇到问题。

所以这是快速的步骤(更具视觉感,因为我更像是一种视觉类型的人):

  1. 为了安全起见,我压缩了整个bin文件夹
  2. 将其移至桌面
  3. 将(当前).gitignore也移动到桌面
  4. 删除整个BIN文件夹
  5. 提交更改(通过喜欢的git commit工具)
  6. 提交,推送,完成!
  7. 返回基本项目的文件夹
  8. 移回.gitignore文件
  9. 可选-也移回(解压缩)bin文件夹。
  10. 结果,您将看到git工具不再跟踪bin文件夹中的更改。

我希望这可以帮助别人。


1
这是我需要的解决方案,可以使用Visual Studio在线托管的存储库。必须删除文件夹,更新gitignore并提交,然后重新添加文件夹。然后obj和bin文件夹被忽略。谢谢
J King

1
这是我需要的确切解决方法。这也应该是公认的答案。太棒了!@Hrvoje
Sathish Prabhakaran

11

如果文件已经添加或提交到您的Git存储库,则必须首先停止跟踪它们,然后.gitIgnore会忽略它们

要停止跟踪SourceTree中的文件:

右键单击文件。选择“停止跟踪”。
这不会删除您的文件,只会停止跟踪它们

要停止从命令行跟踪文件:

git rm --cached example.txt

2

除了上面已经提供的答案外,还请注意,.gitignore如果该文件不在根文件夹中,则该文件将不起作用。

我有一个项目在.gitignore这里/projectname/.gitignore,因此未被阅读。所以我把它移到了/.gitignore,一切又恢复了。


1
我也看到了这一点,但这不是Sourcetree中的错误吗?似乎git spec(git-scm.com/docs/gitignore)允许.gitignore在root之外?
astgtciv

2

这对我有用:

git update-index --assume-unchanged some.file

0

我发现通过删除存储库,然后在重新创建存储库时将.gitignore文件放在文件夹中,可以忽略该文件。


0

挣扎了几个小时,尝试了许多事情,包括这里的建议-无济于事...最终对我有用的是在bitbucket.org中设置存储库时创建.gitignore文件,将该文件拉到我的本地人粘贴了我自己尝试创建的文件的完全相同的内容,现在终于可以正常工作了。

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.