我该如何将空目录(不包含任何文件)添加到Git仓库中?
Git无法跟踪目录,因此唯一的解决方案是在要跟踪的目录中添加一个占位符文件。
该文件可以命名并包含任何你想要的内容,但大多数人使用一个名为.gitkeep
的空文件(尽管有些人更喜欢通用的.keep
)。
前缀的.
标记它为隐藏文件。
另一个想法是添加一个README
文件,解释该目录将用于什么。
一份 PowerShell 版本如下:
查找目录中所有空文件夹
在其中添加一个空的 .gitkeep 文件
Get-ChildItem 'Path to your Folder' -Recurse -Directory | Where-Object {[System.IO.Directory]::GetFileSystemEntries($_.FullName).Count -eq 0} | ForEach-Object { New-Item ($_.FullName + "\.gitkeep") -ItemType file}
ni -p $_.FullName -n .gitignore -v "*`r`n!.gitignore"
- Gregor y如前所述,无法添加空目录,但是以下是一个一行代码的方式,可以向所有目录添加空的.gitignore文件。
ruby -e 'require "fileutils" ; Dir.glob(["target_directory","target_directory/**"]).each { |f| FileUtils.touch(File.join(f, ".gitignore")) if File.directory?(f) }'
我将其放在了一个Rakefile中以便于访问。
find . -type d -empty -print0 | xargs --null bash -c 'for a; do { echo "*"; echo "!.gitignore"; } >>"$a/.gitignore"; done' --
。 - TinoJamie Flournoy的解决方案非常好。以下是稍作改进的版本,以保持.htaccess
:
# Ignore everything in this directory
*
# Except this file
!.gitignore
!.htaccess
使用这个解决方案,您可以提交一个空文件夹,例如/log
,/tmp
或/cache
,并且该文件夹将保持为空。
function check_page_custom_folder_structure () {
if (!is_dir(TEMPLATEPATH."/page-customs"))
mkdir(TEMPLATEPATH."/page-customs");
if (!is_dir(TEMPLATEPATH."/page-customs/css"))
mkdir(TEMPLATEPATH."/page-customs/css");
if (!is_dir(TEMPLATEPATH."/page-customs/js"))
mkdir(TEMPLATEPATH."/page-customs/js");
}
这是在PHP中,但我相信大多数语言都支持相同的功能,并且由应用程序负责创建文件夹,因此文件夹始终存在。
.gitkeep
约定是更好的实践。 - Mild Fuzz以下是一种 hack 方法,但很有趣的是它能够使用(Git 2.2.1)。与 @Teka 建议的方法类似,但更易于记忆:
git submodule add path_to_repo
)。.submodules
的文件。提交更改。.submodules
文件并提交更改。现在,在检出时会创建一个目录。有趣的是,如果查看该文件树对象内容,则会返回:
fatal: Not a valid object name b64338b90b4209263b50244d18278c0999867193
不过我不鼓励使用此方法,因为它可能无法在 Git 的未来版本中运行,并可能导致存储库损坏。
/app/data/**/*.*
!/app/data/**/*.md
*.md
一样唯一地定位它们),以确保目录仍然是存储库的一部分,但文件(带扩展名)将被忽略。限制:目录名称中不允许使用“.”!/ app / data /
下添加更多目录(README.md文件用于烧录每个存储目录的描述)。.gitignore
或通过为每个新目录创建新的.gitignore
来进行去中心化。可能不是最聪明的解决方案,但从gitignore角度来看很简洁,对我来说总是有效的。漂亮而简单!;)
.gitignore
或.keep
可能会破坏它们并导致错误。以下内容可能有所帮助,但不保证有效...mkdir empty
然后您将一个损坏的符号链接添加到此目录中(但在除上述用例之外的任何情况下,请使用带有说明的README
):
ln -s .this.directory empty/.keep
.gitignore
文件中:echo "/empty" >> .gitignore
git add -f empty/.keep
提交后,你的索引中会出现损坏的符号链接,git 会创建一个目录。这个损坏的链接有一些优点,因为它不是常规文件并且指向没有常规文件的地方。所以即使不是故意的,它也符合问题的一部分(“(不包含任何文件)”),我猜测是因为它的意义:
find empty -type f
这个命令显示一个空结果,因为在这个目录中没有文件。所以大多数获取目录中所有文件的应用程序通常不会看到这个链接,至少如果它们执行“文件存在”或“可读性”操作的话。甚至有些脚本也找不到那里的任何文件:
$ php -r "var_export(glob('empty/.*'));"
array (
0 => 'empty/.',
1 => 'empty/..',
)
但我强烈建议只在特殊情况下使用此解决方案,通常在空目录中编写良好的README
文件是更好的选择。(而且我不知道这是否适用于Windows文件系统...)
一种简单的方法是在要(目前)保持为空的目录中添加一个.gitkeep
文件。
请参阅此SOF答案以获取更多信息-该答案还解释了为什么一些人发现添加.gitignore文件(如许多答案中所述)具有竞争性和混淆性。
为混乱的选项添加一个更多的选项。
假设您想要将一个目录添加到git
中,该目录在与git
相关的所有目的上应保持为空,并且其内容不应被跟踪,则像这里多次建议的那样,.gitignore
可以解决问题。
如上所述,格式为:
*
!.gitignore
现在,如果您想在命令行中一次性完成此操作并且还在所需添加的目录内,您可以执行以下操作:
$ echo "*" > .gitignore && echo '!.gitignore' >> .gitignore && git add .gitignore
我个人有一个用于此目的的shell脚本。您可以随意命名该脚本,并将其添加到您的包含路径中,或直接引用它:
#!/bin/bash
dir=''
if [ "$1" != "" ]; then
dir="$1/"
fi
echo "*" > $dir.gitignore && \
echo '!.gitignore' >> $dir.gitignore && \
git add $dir.gitignore
使用此方法,您可以在目标文件夹中执行操作,或将该文件夹作为第一个且唯一的参数进行引用:
$ ignore_dir ./some/directory
如果您想跟踪一个空文件夹,而这个文件夹将来可能包含被跟踪的文件,但现在是空的,可以考虑另一种选项(响应@GreenAsJade的评论),即在.gitignore
文件中省略*
,并将其检入。基本上,所有文件都在说“不要忽略我”,但除此之外,该目录为空且已被跟踪。
您的.gitignore
文件应如下所示:
!.gitignore
就这样,检查一下,你就有了一个空的、但被跟踪的目录,以后可以在其中跟踪文件。
我建议保留这一行代码是因为它给.gitignore
文件赋予了目的。否则,后来的某个人可能会想要删除它。如果在这行代码上方加上注释,可能会有所帮助。