我如何将一个空的目录(不包含文件)添加到一个Git存储库中?


当前回答

添加另一个选项给女士。

假设你想添加一个目录到 git,这对于所有与 git 相关的目的,应该保持空白,从来没有跟踪其内容,一个.gitignore 如这里多次提议,会做这个技巧。

形式,如上所述,是:

*
!.gitignore

$ echo "*" > .gitignore && echo '!.gitignore' >> .gitignore && git add .gitignore

#!/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 文件在那里作为一个工作室。

另一方面,这是一个实施问题,而不是一个基本的Git存储设计问题,正如在Git邮件列表上多次提到的那样,这一点没有实施的原因是没有人照顾足以提交一个插件,而不是它不能或不应该完成。

您可以通过 create_readme.php 保存此代码并从您的 Git 项目的根目录运行 PHP 代码。

php create_readme.php

它将添加 README 文件到所有是空的目录,因此这些目录将被添加到指数。

<?php
    $path = realpath('.');
    $objects = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path),       RecursiveIteratorIterator::SELF_FIRST);
    foreach($objects as $name => $object){
        if ( is_dir($name) && ! is_empty_folder($name) ){
            echo "$name\n" ;
            exec("touch ".$name."/"."README");
        }
    }

    function is_empty_folder($folder) {
        $files = opendir($folder);
        while ($file = readdir($files)) {
            if ($file != '.' && $file != '..')
                return true; // Not empty
            }
        }
?>

然后做

git commit -m "message"
git push

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}

我也面临着空的目录的问题. 使用存储文件的问题是,你需要创建它们,并删除它们,如果它们不再需要(因为后来添加了子目录或文件。

这就是为什么我决定写一个开源工具,可以自动管理创建/删除此类存储文件。 它是为.NET 平台写的,并在 Mono (.NET for Linux) 和 Windows 中运行。

只需看看: http://code.google.com/p/markemptydirs

touch .placeholder

在Linux上,它创建了一个名为.placeholder 的空白文件. 值得一提的是,这个名称是 agnostic 到 git,并在系统中的其他地方使用这种方法,例如 /etc/cron.d/.placeholder. 第二,正如另一个用户指出的那样,.git 预定协议可以为 Git 自己用于配置目的的文件和目录进行备份。

否则,正如另一个答案中所指出的那样,目录可能包含一个描述的 README.md 文件。

无论如何,这都需要文件的存在不会导致您的应用程序破裂。