我最近开始使用Git并且遇到了一件事情。如何跟踪目录而不跟踪其内容?
例如,我正在处理的网站允许上传。我想跟踪uploads目录,以便在分支等时创建它,但显然不是其中的文件(在开发分支中测试文件或在master中的真实文件中)。
在我的.gitignore中,我有以下内容:
uploads/*.*
还试过(忽略整个目录):
uploads/
此目录还可能包含子目录(uploads / thumbs / uploads / videos /)我希望能够跟踪这些目录而不是他们的文件。
这可以用Git吗?我在没有找到答案的情况下到处搜索。
答案 0 :(得分:88)
Git不跟踪目录,它跟踪文件,因此要实现这一点,您需要至少跟踪一个文件。假设你的.gitignore
文件看起来像这样:
upload/*
你可以这样做:
$ touch upload/.placeholder
$ git add -f upload/.placeholder
如果您忘记了-f
,您会看到:
$ 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
然后当你git status
时,你会看到:
# On branch master # # Initial commit # # Changes to be committed: # (use "git rm --cached ..." to unstage) # # new file: upload/.placeholder #
显然你可以这样做:
$ touch upload/images/.placeholder
$ git add -f upload/images/.placeholder
答案 1 :(得分:37)
我写了这篇here。
在目录中添加.gitignore。
答案 2 :(得分:15)
最佳答案我发现在您的上传文件夹中包含.gitignore文件并包含此内容
# Ignore everything in this directory
*
# Except this file
!.gitignore
答案 3 :(得分:12)
目前为止的最佳解决方案:
1)创建 .gitignore 文件
2)写在里面:
*
*/
!.gitignore
3)将.gitignore文件添加到您想要的文件夹中。
答案 4 :(得分:1)
为了仅跟踪目录而不跟踪文件,我执行了以下操作。感谢@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文件的以下内容:
前斜杠仅查找根目录。
/ dir
双星号查找零个或多个目录。
/ ** /