2011-10-08 88 views
2

我有一个git存储库,如果我还没有在目录中添加文件,我想git status忽略所有目录(以及下面的所有内容)。将/*添加到.gitignore几乎可以做到这一点。我可以创建新的目录,将文件放入其中,并且git status将完全没有意义。Git:只有在没有跟踪文件的情况下忽略目录

然后,我创建一个新的目录,并在那里放置一个文件“目录/文件”。然后我git add directory,git commit,并创建一个新的文件这个目录内,比如说“directory/newfile”。问题是git status不会显示新文件。

我试着加!/*/*.gitignore,但它没有做任何事情,据我所知。我如何获得git status以显示带有被跟踪(添加)的文件的目录中的新文件,而忽略没有跟踪文件的目录?

回答

2

其他答案讨论git没有跟踪目录,这是正确的,但不回答这个问题。

首先,/*不仅会忽略目录及其内容,还会忽略存储库根目录中的文件。它忽略了一切。我不确定这是你想要的。如果不是,请尝试更改它/*/。第二,git add directory不会使用忽略模式。 git add将失败,说路径被忽略,你必须使用-f。是的,目录(及其内容)只能添加git add -f directory

现在,你已经添加并提交了目录,当你把一个新文件放入它时,git status不会显示你,因为它当然被忽略了。 Git不会进入目录查找未跟踪的文件。但是,当然,对已经跟踪的文件进行修改将会进入git状态。另外,git add directory/newfile将失败,并显示与使用-f相同的消息。

因此,每当你添加一个目录时,你也必须显式地忽略该特定的目录。所以你将不得不在你的.gitignore中添加诸如!/directory之类的东西。

+0

是否可以使用提交挂钩来自动将'!/ directory'添加到'.gitignore'? –

+0

@JonasHeidelberg - 是的,可能。人们可以使用'git diff --cached --name-only --diff-filter = A'并添加目录以从.gitignore取消管理它。 – manojlds

+0

感谢您提供的信息丰富且乐于助人!我试图实现一个dotfiles系统。不过,这种方法可能有点麻烦。 :-P我可能会使用基于[RM] akefile的系统。 –

0

Git不会自行存储目录。文件路径是节点数据的属性,如果没有文件,则不存在节点。如果'directory'为空,git add directory应该在任何情况下都不起作用。 git status会将新创建的文件显示为未跟踪,除非您将其忽略。尝试git add directory/newfilename,我不确定.gitignore是否会阻止显式添加,但我不认为它确实如此。如果是这样,你将不得不改变.gitignore来允许该目录(在线语法的很多信息)。

0

Git无法跟踪目录。它不会存储空目录,这就是为什么你经常在需要“空”文件夹的项目中找到名为“.keep”的文件。