我该如何将空目录(不包含任何文件)添加到Git仓库中?
另一种让一个目录(在版本库中)保持(几乎)为空的方法是在该目录内创建一个.gitignore
文件,其中包含以下四行:
# Ignore everything in this directory
*
# Except this file
!.gitignore
那么你不必像m104的解决方案中所必须的那样正确排序。
这也有一个好处,当您执行git status时,该目录中的文件不会显示为“未跟踪”。
保留@GreenAsJade的评论:
我认为值得注意的是,这个解决方案正是问题所要求的,但可能不是很多人寻找的。此解决方案保证目录保持为空。它说:“我绝对不想在这里检查文件。”而不是“我没有任何文件要在这里检查,但我需要这个目录,在后面可能会有文件。”
README
文件的内容作为注释写进.gitignore
文件中。 - Carlos Campderrósgit add <dir>
"命令来添加其中的文件。在目录中创建一个名为.gitkeep
的空文件,并使用git add
命令添加它。
在类Unix系统上,这将默认为一个隐藏文件,但它会强制Git确认该目录存在,因为它现在有了内容。
另外请注意,此文件名称并没有特别之处。您可以随意命名。对于Git来说,重要的是文件夹内含有某些内容。
.gitkeep
并非 Git 所规定,容易让人对其含义产生疑问,导致他们去搜索,最终到达此处。.git
前缀惯例应保留给 Git 本身使用的文件和目录。 - t-mart.git
前缀约定应该保留……”为什么?Git是否要求进行此类保留? - lmat - Reinstate MonicaREADME
或 ABOUT
文件会同样好甚至更好。留下一条便条给下一个人,就像在没有 URL 的时候我们都曾做过的那样。 - Dave您可以在目录中放置一个README文件,解释为什么您想要将这个空的目录放入代码库中。
touch .placeholder
在Linux上,这将创建一个名为.placeholder
的空文件。值得一提的是,此名称与git无关,并且该方法在系统中的其他位置(例如/etc/cron.d/.placeholder
)中也被使用。其次,正如另一位用户指出的那样,.git
前缀约定可以保留供Git本身用于配置目的的文件和目录。README.md
文件。.keep
而不是.gitkeep
的原因非常好。在简单和不易混淆之间取得了很好的平衡。命名空间似乎很重要,不应该打破.git...
看起来像git自己的文件命名空间。附加文档可以放在项目的全局readme或编码风格指南或本地readme中。如果您已经采用了.gitkeep
的习惯,请找到这些文件并将它们重命名为:git mv .gitkeep .keep
。拥抱变化!Git文档推荐的.gitignore
解决方案似乎是一个hacky的解决方法,过于复杂。 - mit首先说明:
在Git版本控制系统下,空目录不能作为树的一部分被跟踪。
它只是不会被追踪。但是,在某些情况下,“版本控制”空目录可能具有意义,例如:
cache/
或 logs/
目录,在这里我们想提供文件夹但是要.gitignore
其内容。许多用户建议:
README
文件或另一个带有一些内容的文件,以使目录非空,或者.gitignore
文件,其中包含一种“反向逻辑”(即包括所有文件),这最终实现了第1种方法的相同目的。虽然这两个解决方案肯定有效,但我认为它们与Git版本控制的有意义的方法不一致。
.gitignore
来执行相反于其用途(保留文件)的操作,尽管这是可能的?使用一个名为.gitkeep
的空文件来强制将文件夹存在于版本控制系统中。
虽然看起来并没有什么大的区别:
您可以使用一个专门用于保存文件夹的文件,而不会在其中放置任何您不想放置的信息。
例如,您应该将README作为有用信息的README,而不是为了保留文件夹而借口。
关注点分离始终是一件好事情,而且您仍然可以添加.gitignore
来忽略不想要的文件。
将其命名为.gitkeep
,从文件名本身就非常明确和简单(对于其他开发人员也是如此,这对于共享项目和Git存储库的核心目的之一很有好处),表明此文件是
我看到像Laravel、Angular-CLI这样的重要框架采用了.gitkeep
方法。
如其他答案所述,Git无法在其暂存区中表示空目录。(请参见Git FAQ。)但是,如果对于你的目的来说,一个目录只要包含一个.gitignore
文件就足够为空,那么你可以通过以下方式仅在空目录中创建.gitignore
文件:
find . -type d -empty -exec touch {}/.gitignore \;
find . -name .git -prune -o -type d -empty -exec touch {}/.gitignore \;
- steffenfind * -type d -empty -exec touch {}/.gitignore \;
。(注:该命令会在查找到的所有空文件夹中创建名为 ".gitignore" 的文件。) - akhanfind . -name .DS_Store -exec rm {} \;
命令删除所有.DS_Store文件,然后再使用此答案中提供的首选变体。
请确保只在正确的文件夹中执行此操作! - zerweck.gitignore
中对 find
命令的 -empty
标志没有影响。我的评论是关于删除目录树中的 .DS_Store
文件,以便可以应用 -empty
标志。 - zerweck安迪·莱斯特(Andy Lester)说得对,但如果您的目录只需要是空的,而不是真正意义上的“空”,那么您可以将一个空的.gitignore
文件作为解决方法放在里面。
另外,这是一个实现问题,而不是一个基本的Git存储设计问题。正如在Git邮件列表中多次提到的那样,之所以还没有实现这个功能是因为没有人关注到提交一个补丁,而不是不能或不应该做。
touch .gitkeep
ll -a
.gitignore
文件。有了这个文件,目录就不再为空,Git会跟踪它。.gitignore
文件的作用是忽略东西,但在这里却用来保留某些东西。.gitkeep
。这至少在文件名中表达了意图。此外,这似乎在一些项目中达成了共识。Git本身并不关心文件的命名,它只关心目录是否为空。
有一个问题是.gitkeep
和.gitignore
共同面临的:根据Unix约定,这些文件是隐藏的。一些工具,比如ls
或cp dir/*
,会假装这些文件不存在,表现得好像目录是空的。而其他工具,比如find -empty
,则不会如此。新手Unix用户可能会被这个问题困扰。有经验的Unix用户会推断出存在隐藏文件并进行检查。无论如何,这是一个可以避免的烦恼。
顺便说一下:解决"隐藏文件问题"的一个简单方法是将文件命名为gitkeep
(不带前导点)。我们还可以更进一步,将文件命名为README
。然后,在文件中解释为什么需要将目录保持空白并在git中进行跟踪。这样其他开发人员(包括未来的你)就可以了解为什么事情是这样的。
总结:在目录中放置一个文件,现在(原本为空的)目录就被git跟踪了。
潜在问题:目录不再为空。
假设你需要空目录是因为你要在其中收集文件以供以后处理。但现在你不仅有了你想要的文件,还有一个叫做.gitignore或gitkeep的流氓文件,或者其他类似的文件。这可能会使简单的bash构造(如for file in dirname/*)变得复杂,因为你需要排除或特殊处理这个额外的文件。find -type d -empty
.git
目录:find -name .git -prune -o -type d -empty -print
.gitkeep
的文件的每个目录:find -type f -name .gitkeep
find -type f -printf "%h\n" | sort | uniq -c | sort -n