如何使用Git跟踪目录而不是文件?


85

我最近开始使用Git,但遇到一件事却遇到了麻烦。如何跟踪目录而不跟踪目录的内容?

例如,我正在工作的网站允许上传。我想跟踪上载目录,以便在分支等时创建该目录,但显然不是其中的文件(develop分支中的测试文件或master中的实际文件)。

在我的.gitignore中,我有以下内容:

上传/*.*

也尝试过(忽略整个目录):

上传/

该目录可能还包含子目录(uploads / thumbs / uploads / videos /),我希望能够跟踪这些文件,但不能跟踪它们的文件。

Git有可能吗?我到处搜索都找不到答案。


Git仅跟踪文件。您可以做的是使用git挂钩,并跟踪一个包含目录列表的文件(使用挂钩自动生成)。尽管我不完全确定是否可能。
西蒙·托特

更具体的说:Git跟踪内容,而(对于git)一个空目录不满意。您可以争论(无论是否同意),但是作为另一个“替代方法”,您可以考虑在需要时在build / install /上创建目录。但是:我也使用“ .placeholder-file” -solution;)
KingCrunch 2011年

1
我不使用.placeholder,而是使用.gitignore文件。这不仅会处理目录中的排除项,而且它本身也充当占位符。
阿比森2011年

Answers:


113

Git不会跟踪目录,它会跟踪文件,因此要实现这一点,您至少需要跟踪一个文件。因此,假设您的.gitignore文件如下所示:

upload/*

你可以这样做:

$ touch upload/.placeholder
$ git add -f upload/.placeholder

如果忘记了,-f您会看到:

$ git添加上载/.placeholder
.gitignore文件之一将忽略以下路径:
上载
如果您确实要添加它们,请使用-f。
致命:未添加文件

然后,当您执行此操作时,git status您将看到:

#在分支主管上
#
#初次提交
#
#要提交的更改:
#(使用“ git rm --cached ...”取消登台)
#
#新文件:upload / .placeholder
#

显然,您可以这样做:

$ touch upload/images/.placeholder
$ git add -f upload/images/.placeholder

谢谢,这正是我所需要的。

11
占位符的常见约定是gitignore文件。
卡斯卡贝尔2011年

2
@Jefromi实际上,正如我对Abizern的评论一样,我从未考虑过使用该.gitignore文件作为占位符。
彼得·法默

1
糟糕,以某种方式错过了这些评论。
卡斯卡贝尔2011年

2
Git不会跟踪目录,当他们告诉您UNIX中的所有文件都是文件,甚至目录也是文件时,它也会跟踪文件,听起来很有趣
Green

38

在这里写过这个。

在目录中添加.gitignore。


1
漂亮的小文章和评论!使用的.gitignore作为占位符文件从未考虑过....
彼得农民

谢谢。我只是通过写帖子并获得评论来学到一些东西。
阿比森2011年

1
似乎有一种流行的命名约定正在使用.gitkeep
tarabyte 2014年

刚刚得到了“哈哈”的祝福,我希望我可以
投票



6

为了仅跟踪目录而不跟踪文件,我执行了以下操作。感谢@PeterFarmer对git仅跟踪文件的评论,我得以保留除文件之外的所有目录,如下所述。

# exclude everything in every folder
/data/**/*.*

# include only .gitkeep files
!/data/**/*.gitkeep

将其添加到.gitignore文件即可完成工作。以下是我的文件夹结构。

data/
├── processed
│   ├── dataset1.csv
│   └── dataset2.csv
├── raw
│   ├── raw_dataset1.json
└── test
    ├── subfolder
    │   └── dataset2.csv
    └── reviews.csv

当我这样做时git add . && git status,git只识别文件夹,而不识别文件。

Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        modified:   .gitignore
        new file:   data/processed/.gitkeep
        new file:   data/raw/.gitkeep
        new file:   data/test/.gitkeep
        new file:   data/test/subfolder/.gitkeep

请记住,.gitignore文件的以下内容:

斜杠前仅查找根目录。

/目录

双星号查找零个或多个目录。

/ ** /


谢谢!我正在使用这种方式,它非常有帮助
sebasira
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.