关于目录:如何使用Git跟踪目录而不是他们的文件?

How to track directories but not their files with Git?

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

例如,我正在工作的站点允许上载。我想跟踪uploads目录,以便在进行分支等操作时创建它,但显然不跟踪其中的文件(开发分支时的测试文件或master中的真实文件)。

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

1
uploads/*.*

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

1
uploads/

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

使用Git可以吗?我到处找都找不到答案。


Git不跟踪目录,它跟踪文件,因此要实现这一点,至少需要跟踪一个文件。所以假设你的.gitignore文件看起来是这样的:

1
upload/*

您可以这样做:

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

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

1
2
3
4
5
$ git add upload/.placeholder
The following paths are ignored by one of your .gitignore files:
upload
Use -f if you really want to add them.
fatal: no files added

然后,当你这样做时,你会看到:

1
2
3
4
5
6
7
8
9
# On branch master
#
# Initial commit
#
# Changes to be committed:
#   (use"git rm --cached ..." to unstage)
#
#   new file:   upload/.placeholder
#

显然,你可以这样做:

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


我在这里写的。

在目录中添加.gitignore。


我找到的最佳答案是在上载文件夹中包含一个包含此内容的.gitignore文件

1
2
3
4
# Ignore everything in this directory
*
# Except this file
!.gitignore

在这里,您知道如何向Git存储库添加一个空目录吗?


目前最好的解决方案是:

1)创建.gitignore文件

2)写在里面:

1
2
3
*
*/
!.gitignore

3)将.gitignore文件添加到所需的文件夹中。

资料来源:https://stackoverflow.com/a/5581995/2958543


为了只跟踪目录而不跟踪文件,我执行了以下操作。由于@peterfarmer对git只跟踪文件的评论,我可以保留所有目录,不包括下面描述的文件。

1
2
3
4
5
# exclude everything in every folder
/data/**/*.*

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

把它添加到.gitignore文件中就可以了。以下是我的文件夹结构。

1
2
3
4
5
6
7
8
9
10
data/
├── processed
│   ├── dataset1.csv
│   └── dataset2.csv
├── raw
│   ├── raw_dataset1.json
└── test
    ├── subfolder
    │   └── dataset2.csv
    └── reviews.csv

当我执行git add . && git status操作时,git只识别文件夹,而不识别文件。

1
2
3
4
5
6
7
8
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文件的以下内容:

前置斜杠只查找根目录。

/dir

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

/**/