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不跟踪目录,它跟踪文件,因此要实现这一点,至少需要跟踪一个文件。所以假设你的
1 | upload/* |
您可以这样做:
1 2 | $ touch upload/.placeholder $ git add -f upload/.placeholder |
如果你忘记了
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 |
当我执行
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
双星号查找零个或多个目录。
/**/