Git repo坏了吗? - 尽管gitignore仍然跟踪文件

时间:2014-05-13 10:44:07

标签: git

我有这个目录:

/thumbs

在这个目录中,我有一个.gitignore文件,里面有这个:

#remove everything
*

#except this:
!.gitignore

如果我将图像文件添加到此目录中,我会这样做:

git status

图像文件列为未跟踪。

我该怎么办?

请注意以下事项:

在该目录中,我已经完成了:

git rm -r --cached .
git add .
git commit -m "gitignore SHOULD work"

我已经删除.gitignore文件中的任何额外的底部空格以确定。

但是,如果我添加该文件,它似乎未跟踪。

为什么?

我能做些什么来查看问题所在?

更新 在此文件夹中:

/user_uploaded_file这是/thumbs的PARENT文件夹我有以下gitignore:

#ignore everything
*

#except:
!.gitignore
!/thumbs

奇怪的事实:

如果我从父级内部的gitignore中删除了!/thumbs指令,我们在git ls-files内执行的!/thumbs只会考虑.gitignore。 我们可以自由添加,更改或删除git不关心的图像文件。

但是,如果我们将该行!/thumbs放在父文件夹的gitignore中,它会将图像列为未跟踪的。

更新2

好奇的事实II:

如果在PARENT文件夹gitignore文件中我们这样做:

B)

*
!.gitignore
!/thumbs/.gitignore

而不是:

A)

*
!.gitignore
!/thumbs/

似乎有效。我的意思是,如果我们在/thumbs添加 更改删除文件,git会正确忽略它们。

然而,虽然这适用于这个特定的本地回购,例如,我自己的回购,我不需要任何这些, A),有效。

:■

2 个答案:

答案 0 :(得分:2)

首先,您必须添加并提交.gitignore文件,以便gitignore忽略该文件。

如果之前已提交相关文件,则需要git rm [filename]将其删除。完成后,如果它被添加到您的gitignore(并且添加并提交了.gitignore),它将被忽略。

答案 1 :(得分:0)

这里没有加东西

请考虑以下行动:

$ mkdir -p /tmp/example
$ cd /tmp/example
$ git init .
$ mkdir -p user_uploaded_file/thumbs
$ echo "some noise" > user_uploaded_file/thumbs/somefile
$ git add user_uploaded_file/thumbs/somefile
$ git commit -m "simulate initial dirty state"

$ vim user_uploaded_file/.gitignore
$ vim user_uploaded_file/thumb/.gitignore
$ git add user_uploaded_file/.gitignore user_uploaded_file/thumbs/.gitignore
$ git commit -m "add ignore files from the question"

$ echo "some noise" > user_uploaded_file/thumbs/someotherfile

检查当前状态:

$ git status
# On branch master
nothing to commit (working directory clean)

$ git status --ignored
# On branch master
# Ignored files:
#   (use "git add -f <file>..." to include in what will be committed)
#
#   user_uploaded_file/thumbs/someotherfile

请注意,没有列出要提交的内容,并使用--ignored标记显示哪些文件被忽略。

正在删除thumb / .gitignore文件

  

我做了:git rm -r --cached。

这并不是你想要的,尽管这不是问题的一个因素:

$ cd user_uploaded_file/thumbs
$ git rm -r --cached .
$ rm 'user_uploaded_file/thumbs/.gitignore'
$ rm 'user_uploaded_file/thumbs/somefile'

删除不需要的文件 - 但它也删除了git ignore文件,可以选择性地撤消:

$ git reset HEAD .gitignore
$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   deleted:    user_uploaded_file/thumbs/somefile
#

请注意,.gitignore文件现在不会显示为已删除。

解决方案

让我们看看解决问题的方法,而不是专注于你所做的事情。据我所知,问题是您已将噪声提交到存储库,并且您想删除它。

清理一次安装

要清理一个结账,所需的只是删除文件并提交:

$ git ls-files user_uploaded_file/thumbs/
user_uploaded_file/thumbs/.gitignore
user_uploaded_file/thumbs/somefile

$ git status --ignored
# On branch master
# Ignored files:
#   (use "git add -f <file>..." to include in what will be committed)
#
#   user_uploaded_file/thumbs/someotherfile

$ git rm -r --cached user_uploaded_file/thumbs/
rm 'user_uploaded_file/thumbs/.gitignore'
rm 'user_uploaded_file/thumbs/somefile'

$ git reset HEAD user_uploaded_file/thumbs/.gitignore
$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   deleted:    user_uploaded_file/thumbs/somefile
#

$ git status --ignored
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   deleted:    user_uploaded_file/thumbs/somefile
#
# Ignored files:
#   (use "git add -f <file>..." to include in what will be committed)
#
#   user_uploaded_file/thumbs/somefile
#   user_uploaded_file/thumbs/someotherfile
#   
$ git commit -m "deleting thumb files"

这会删除文件(虽然它们仍然会存在于文件库中,然后推送到远程文件

$ git pull
$ git push
...

检查本地结帐的提交内容:

$ git branch -v
* master f216a83 deleting thumb files

清理其他安装

在同一存储库的所有其他签出中,删除这些已经跟踪的缩略图文件所需的唯一步骤是:

$ git pull
remote: Counting objects: 7, done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 4 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (4/4), done.
From /tmp/exmaple2/../example
   41ec014..f216a83  master     -> origin/master
First, rewinding head to replay your work on top of it...
Fast-forwarded master to f216a83940be0e60d560b27a882b9abca46ea383.
$ git branch -v
* master f216a83 deleting thumb files

$ git ls-files user_uploaded_file/thumbs
user_uploaded_file/thumbs/.gitignore

$ git status
# On branch master
nothing to commit (working directory clean)

$ ls -la user_uploaded_file/thumbs/
total 16
drwxrwxr-x 2 www-data www-data 4096 May 13 13:51 .
drwxrwxr-x 3 www-data www-data 4096 May 13 13:30 ..
-rw-rw-r-- 1 www-data www-data   48 May 13 13:30 .gitignore
-rw-rw-r-- 1 www-data www-data    4 May 13 13:49 morefiles

请注意,这将删除之前跟踪过的文件。

如果其他安装位于不同的分支上 - 所做的更改需要合并/挑选,因为它们不在分支历史记录中。

如果其他安装位于同一分支但不同的提交,则它具有本地提交 - 您需要检查原因/本地提交是否影响问题。< / p>

git ignore文件过于复杂

现有的git ignore文件的内容并不是必需的,它们可以很简单:

$ cd /tmp/example
$ echo "*" > user_uploaded_file/.gitignore
$ echo "*" > user_uploaded_file/thumbs/.gitignore
$ git commit -m "ignore everything in the user_uploaded_file folder"

文件user_uploaded_file/thumbs/.gitignore实际上没有用于忽略目的,如果只是为了确保文件夹存在 - 实际上您可以使用空文件and name it anything