【问题标题】:How to track directories but not their files with Git?如何使用 Git 跟踪目录而不是它们的文件?
【发布时间】:2011-02-23 12:39:06
【问题描述】:

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

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

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

上传/*.*

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

上传/

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

这可以通过 Git 实现吗?我到处搜索都没有找到答案。

【问题讨论】:

  • Git 只跟踪文件。您可以做的是使用 git 挂钩并跟踪将包含目录列表的文件(使用挂钩自动生成)。虽然我不完全确定这是否可能。
  • 更具体:Git 跟踪 content 并且(对于 git)空目录不是内容。无论您是否同意,您都可以争论,但作为另一种“解决方法”,您可能会考虑在 build/install/when-needed 上创建目录。但是:我也使用“.placeholder-file”-解决方案;)
  • 我不使用 .placeholder,而是使用 .gitignore 文件。这不仅会处理目录中的排除项,而且它本身也充当占位符。

标签: git directory gitignore


【解决方案1】:

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

upload/*

你可以这样做:

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

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

$ git add 上传/.placeholder 您的 .gitignore 文件之一会忽略以下路径: 上传 如果您真的想添加它们,请使用 -f。 致命:没有添加文件

然后当您执行git status 时,您会看到:

# 在分支master上 # # 初始提交 # # 要提交的更改: # (使用“git rm --cached ...”取消暂存) # # 新文件:上传/.placeholder #

显然你可以这样做:

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

【讨论】:

  • 谢谢,这正是我所需要的。
  • 占位符的常用约定是 gitignore 文件。
  • @Jefromi 确实,作为我在 Abizern 的 cmets,从未考虑过使用 .gitignore 文件作为占位符。
  • 糟糕,不知何故错过了那些 cmets。
  • Git 不跟踪目录,它只跟踪文件当他们告诉你在 UNIX 中一切都是文件,甚至目录也是文件时,这听起来很有趣
【解决方案2】:

我写过这个here

在目录中添加一个 .gitignore。

【讨论】:

  • 不错的小文章和cmets!从未考虑过使用 .gitignore 作为占位符文件......
  • 谢谢。我只是通过写一篇文章和获得cmets学到了一些东西。
  • 现在似乎有一个流行的命名约定来使用.gitkeep
  • 刚刚得到那个“哈哈”的时刻,我希望我能在 6 个不同的时间点赞
【解决方案3】:

我发现的最佳答案是在您的上传文件夹中包含一个包含此内容的 .gitignore 文件

# Ignore everything in this directory
*
# Except this file
!.gitignore

这里有How can I add an empty directory to a Git repository?

【讨论】:

  • 这是最优雅的解决方案
【解决方案4】:

目前最好的解决方案:

1) 创建一个.gitignore文件

2) 写在里面:

*
*/
!.gitignore

3) 将 .gitignore 文件添加到您想要的文件夹中。

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

【讨论】:

    【解决方案5】:

    为了只跟踪目录而不跟踪文件,我执行了以下操作。感谢@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 文件:

    前置斜杠仅查找根目录。

    /目录

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

    /**/

    【讨论】:

    • 谢谢!我正在使用这种方式,非常有帮助
    【解决方案6】:

    (在您的示例中,directoryuploads。)

    在根目录,.gitignore 文件中,放入:

    directory/*
    !*.gitkeep
    

    然后在directory中保存一个空的.gitkeep文件。

    【讨论】:

      猜你喜欢
      • 2016-12-26
      • 1970-01-01
      • 2022-11-12
      • 2016-12-19
      • 2017-01-16
      • 2015-08-01
      • 1970-01-01
      • 2017-12-30
      • 1970-01-01
      相关资源
      最近更新 更多