如何将空目录添加到Git存储库?

vojdkbi0  于 2022-09-21  发布在  Git
关注(0)|答案(9)|浏览(225)

如何将空目录(不包含任何文件)添加到Git存储库?

zazmityj

zazmityj1#

使目录(在存储库中)保持(几乎)为空的另一种方法是在包含以下四行的目录中创建一个.gitignore文件:


# Ignore everything in this directory

* 

# Except this file

!.gitignore

这样,您就不必像在M104的solution中那样获得正确的顺序。

这还提供了一个好处,即当您执行git状态时,该目录中的文件不会显示为“未跟踪”。

让@GreenAsJade的评论经久不衰:
我认为值得注意的是,这个解决方案正是问题所要求的,但可能不是许多关注这个问题的人所寻找的。此解决方案可确保目录保持为空。上面写着“我真的永远不想让文件在这里签入”。与“我在这里没有任何文件要签入,但我需要这里的目录,文件可能稍后会来”不同。

rkttyhzu

rkttyhzu2#

你不能。请看Git常见问题解答。
目前,git索引(临时区域)的设计只允许列出文件,没有人足够有能力进行更改以允许空目录,但没有人足够关心这种情况来补救它。

在目录中添加文件时,会自动添加目录。也就是说,目录永远不需要添加到存储库中,并且不会自行跟踪。

你可以说“git add <dir>”,它会在里面添加文件。

如果您确实需要在 checkout 中存在一个目录,则应该在其中创建一个文件。.gitignore可以很好地用于此目的;您可以将其保留为空,或者填写您希望在目录中显示的文件的名称。

iszxjhcz

iszxjhcz3#

在目录中创建一个名为.keep的空文件,并添加该文件。

默认情况下,这将是大多数系统上的隐藏文件,但它会强制git承认该目录的存在,因为它现在有内容。

aamkag61

aamkag614#

您始终可以在目录中放置一个自述文件,并解释为什么要在存储库中放置该目录,否则为空目录。

huus2vyu

huus2vyu5#

touch .placeholder

在Linux上,这将创建一个名为.placeholder的空文件。不管它有什么价值,这个名称对git是不可知的,这种方法在系统中的其他地方使用,例如/etc/cron.d/.placeholder。其次,正如另一位用户所指出的,.git前缀约定可以保留给Git本身用于配置目的的文件和目录。

或者,如另一个answer中所述,该目录可以包含描述性的README.md file

无论采用哪种方式,这都要求文件的存在不会导致应用程序中断。

x8diyxa7

x8diyxa76#

为什么需要空的版本化文件夹

首先要做的是:
空目录不能是Git版本控制系统下的树的一部分

它根本不会被追踪。但在某些情况下,“版本化”空目录可能是有意义的,例如:

  • 搭建预定义的文件夹结构,使其可供存储库的每个用户/贡献者使用;或者,作为上述的特殊情况,为临时文件创建一个文件夹,例如cache/logs/目录,我们希望在其中提供该文件夹,但.gitignore提供其内容
  • 与上述相关,一些项目没有一些文件夹就不能工作(这通常是一个设计很差的项目的暗示,但这是一个常见的现实场景,可能会有权限问题需要解决)。

一些建议的解决方法

很多用户建议:

1.放置README文件或其他包含某些内容的文件,以使目录非空,或
1.创建一个.gitignore文件,采用某种“反向逻辑”(即包括所有文件),最终达到与方法1相同的目的。

虽然这两种解决方案肯定都有效但我发现它们与Git版本控制的有意义的方法不一致。

  • 为什么你应该在你的项目中放入你并不真正想要的虚假文件或自述文件?
  • 为什么使用.gitignore做一件与它的本意(排除文件)完全相反的事情(保留文件),即使它是可能的?

.gitKeep方法

使用名为.gitkeep文件,以强制在版本控制系统中存在该文件夹。

尽管这可能看起来没有那么大的区别:

  • 您使用的文件具有保存文件夹的单一目的。你不能放任何你不想放的信息。

例如,你应该使用自述信息系统,就像使用具有有用信息的自述系统一样,而不是作为保留文件夹的借口。

分离关注点总是一件好事,您仍然可以添加.gitignore来忽略不需要的文件。

  • 将其命名为.gitkeep使文件名本身(以及对于其他开发人员,这对共享项目和Git存储库的核心目的之一很好)非常清楚和直接地表明该文件是

  • 与代码无关的文件(因为前导圆点和名称)

  • 一份明显与Git有关的文件

  • 它的目的(保持)是清楚说明的,一致的,语义上相反的忽略

采用

我看到LaravelAngular-CLI等非常重要的框架采用了.gitkeep方法。

hwamh0ep

hwamh0ep7#

正如在其他答案中所描述的,Git无法表示其临时区域中的空目录。(请参阅Git常见问题解答。)但是,如果仅包含.gitignore文件的目录足够空,则您只能通过以下方式在空目录中创建.gitignore文件:

find . -type d -empty -exec touch {}/.gitignore ;
xpszyzbs

xpszyzbs8#

Andy Lester是对的,但如果您的目录只需要是空的,而不是空的,您可以在其中放置一个空的.gitignore文件作为解决办法。

顺便说一句,这是一个实现问题,而不是基本的Git存储设计问题。正如在Git邮件列表中多次提到的那样,这一功能尚未实现的原因是没有人足够关心它的补丁,而不是它不能或不应该这样做。

rbpvctlc

rbpvctlc9#

Ruby on Rails日志文件夹创建方式:

mkdir log && touch log/.gitkeep && git add log/.gitkeep

现在,日志目录将包含在树中。它在部署时非常有用,因此您不必编写例程来创建日志目录。

可以通过发出以下命令来阻止日志文件,

echo log/dev.log >> .gitignore

但你可能知道这一点。

相关问题