无法忽略Git存储库中以前忽略的文件


70

我有一个网站,该网站的/sites/default/files/目录通常会保存用户内容。考虑到我不需要跟踪这些东西,我在/ gitignore文件中添加了/ sites / default / files /。

然后我发现我也想在该目录中保留一些大多数永久性的上载。现在,更有意义的是跟踪/ sites / default / files /中的所有内容并排除不需要的子目录,而不是相反。

问题在于,Git不会停止忽略该目录。我从.gitignore中删除了指定此目录的行,并且该行不会跟踪它。我可以选择git add /sites/default/files/ -f强制git跟踪目录,但是我之前已经做过,而且看起来很乱。

如果.gitignore不再指定该目录为忽略目录,为什么我必须强制Git开始跟踪那些文件?


1
您是否偶然使用了子模块?也许是site /或site / default /甚至是site / default / files /?还要检查这三个目录中的每个目录,专门用于.gitignore文件。您也可以尝试git add -f sites/default/files/*添加特定文件,而不是添加目录。
twalberg 2012年

不,没有子模块(不知道它们,但是会记住它们供将来使用-谢谢)。仔细检查了所有目录是否有更多的.gitignore文件-什么都没有。并尝试git add -f sites/default/files/*不这样做:当我touch sites/default/files/test.minegit仍然看不到它时。
doub1ejack

1
嗯...好吧,您确定.gitignore那场比赛中没有其他条目了吗-某种通配符或类似的东西?还是会导致单个文件被忽略的某种东西-如*.pyc,而该目录仅包含.pyc文件?请记住,命名file.gitignore也匹配任何subdirectory/filesub/subdir/file...
twalberg

啊!就是这样。还有其他files/隐藏的条目,我正在寻找sites/default/..。嗯,这是一个愚蠢的错误的大量努力。叹。谢谢。
doub1ejack 2012年

Answers:


72

您已经知道该怎么做了。是的,git add -f就是这样。

如果您问为什么...这是因为git在assume-unchanged内部进行了一些设置。这一点使git认为该文件未修改,因此git add不会添加它。

如果您想弄乱实现细节,可以使用git update-index --no-assume-unchanged <file>命令。


因此,大概是当我强迫git添加这些文件并将其推送到我们的开发存储库时,我们所有其他开发人员也将开始跟踪它们,对吗?当他们自己的.gitignore文件忽略从dev repo中拉出的文件时(直到他们更新其本地.gitignore文件),我在查看它的工作方式时遇到了一些麻烦,但是我只相信git就可以了。 。
doub1ejack

.gitignore应该处于版本控制中。其他开发人员应在更新时获取它。
J-16 SDiZ 2012年

是的,他们应该。但是,对.gitignore文件的更改无法解决问题,因此我想知道是否每个其他开发人员都必须-f在其本地存储库上使用相同的修复程序。
doub1ejack

@ doub1ejack,当他们结帐时.gitignore,他们也会得到您的礼物/sites/default/files。这些文件将被正确跟踪。
J-16 SDiZ 2012年

13

我不认为J-16是正确的。从http://www.kernel.org/pub/software/scm/git/docs/git-add.html

git add命令默认不会添加被忽略的文件。如果在命令行上明确指定了任何被忽略的文件,则git add将失败,并显示被忽略文件的列表。由目录递归或Git执行的文件名通配符(在Shell之前引用通配符)所到达的忽略文件将被静默忽略。git add命令可用于通过-f(force)选项添加忽略的文件。

git add -f似乎仅用于添加在某个地方的忽略文件中确实存在的文件。

也许/ sites或/ sites / default中还有另一个.gitignore文件,它也告诉Git忽略此目录,或者它是否已在.git / info / exclude中设置?


不,我只有一个.gitignore文件,排除文件为空。
doub1ejack 2012年

那我想念什么吗?我尝试重现您的情况(pastebin.com/wZB6F8Qj),并且在编辑.gitignore之后,该文件确实再次显示为未跟踪,并且git add file可以正常工作。
hdgarrood

我也开始怀疑...使用-f强制git添加目录后,如果再次执行git addgit告诉我该目录被我的.gitignore文件之一忽略了。我在本地存储库中搜索了.gitignore,仅找到一个并打开了排除文件,并确认它没有干扰。上午失去了一些东西?
doub1ejack

1
哇...我想我不在这里。我不知道发生了什么,不。这在黑暗中有点刺痛,但是在SVN中进行新的签出对我来说已经解决了一些问题……也许尝试对新克隆执行相同操作?编辑:没关系,刚刚看到您的答案
hdgarrood

我的天啊!非常感谢您指向.git / info / exclude文件。我的问题是该文件夹也包含在其中。+1
Kainax '16

6

为了后人:我的问题的答案是“近距离观察”。

@twalberg正确指出,.gitignore文件中可能存在一条我忽略的规则。应用.gitignore规则的级联方式使排除比预期范围更广的文件变得容易。

据我所知,我对git如何工作的假设是正确的。同样,我的案件似乎不支持(或反对)@ J-16 SDiZ关于该assume-unchanged钻头可能起什么作用的评论。


2

我们在Drupal站点目录中有一个非常相似的问题。问题是Drupal发行版在更高级别的drupal目录中具有一个.gitignore文件,该文件与drupal / sites / files / *中的任何内容匹配


0

就我而言,回购中忽略了.png.xlsx文件。正如@ doub1ejack,@ J-16 SDiZ和其他指出的那样,您需要使用git add -f跟踪更改。但是,git add -f除非您明确指定文件或模式并以

Nothing specified, nothing added.

Maybe you wanted to say 'git add .'?

为了开始跟踪以前忽略的文件或模式:

  1. 首先,您需要通过输入将工作目录更改为存储库cd <path>
  2. 其次,您需要指定文件或模式以通过键入git add -f <file name>.extension特定文件或git add -f *.xlsx所有excel文件来跟踪它们。

对于我的情况,这忽略了被忽略的文件。您也可以查看此YouTube视频

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.