空のディレクトリ (ファイルを含まない) を Git リポジトリに追加するにはどうすればよいですか?
37 に答える
ディレクトリを (リポジトリ内で) (ほぼ) 空のままにする別の方法は、.gitignore
そのディレクトリ内に次の 4 行を含むファイルを作成することです。
# Ignore everything in this directory
*
# Except this file
!.gitignore
次に、m104 のソリューションで行う必要がある方法で順序を正しくする必要はありません。
これにより、git status を実行したときに、そのディレクトリ内のファイルが「未追跡」として表示されないという利点もあります。
@GreenAsJadeのコメントを永続化する:
この解決策は質問が求めていたことを正確に実行することに注意する価値があると思いますが、おそらくこの質問を見ている多くの人が探していたものではないでしょう. このソリューションは、ディレクトリが空のままであることを保証します。「ここでファイルをチェックインしたくない」と書かれています。「ここにチェックインするファイルはまだありませんが、ここにディレクトリが必要です。ファイルは後で来る可能性があります」とは対照的です。
できません。Git FAQを参照してください。
現在、git インデックス (ステージング領域) の設計では、ファイルの一覧表示のみが許可されており、空のディレクトリを許可するように変更を加えるほど有能な人は誰も、この状況を修正するのに十分な注意を払っていません。
ディレクトリ内にファイルを追加すると、ディレクトリが自動的に追加されます。つまり、ディレクトリをリポジトリに追加する必要はなく、ディレクトリ自体は追跡されません。
「 」と言うと
git add <dir>
、そこにファイルが追加されます。チェックアウトに存在するディレクトリが本当に必要な場合は、その中にファイルを作成する必要があります。.gitignore はこの目的に適しています。空のままにすることも、ディレクトリに表示されると予想されるファイルの名前を入力することもできます。
ディレクトリに呼び出される空のファイルを作成し.gitkeep
、それを追加します。
リポジトリにこのディレクトリが必要な理由を説明したREADMEファイルを、それ以外の場合は空のディレクトリにいつでも配置できます。
As described in other answers, Git is unable to represent empty directories in its staging area. (See the Git FAQ.) However, if, for your purposes, a directory is empty enough if it contains a .gitignore
file only, then you can create .gitignore
files in empty directories only via:
find . -type d -empty -exec touch {}/.gitignore \;
Andy Lester は正しいですが、ディレクトリを空にするだけでなく、空にする必要がない場合は.gitignore
、回避策として空のファイルをそこに置くことができます。
余談ですが、これは実装の問題であり、基本的な Git ストレージ設計の問題ではありません。Git メーリング リストで何度も言及されているように、これが実装されていない理由は、誰もパッチを提出するのに十分な注意を払わなかったためであり、実行できなかった、またはすべきでないからではありません。
Ruby on Railsのログ フォルダーの作成方法:
mkdir log && touch log/.gitkeep && git add log/.gitkeep
これで、ログ ディレクトリがツリーに含まれます。これはデプロイ時に非常に便利なので、ログ ディレクトリを作成するためのルーチンを記述する必要はありません。
ログファイルは、発行することで除外できます。
echo log/dev.log >> .gitignore
しかし、あなたはおそらくそれを知っていました。
Git は空のディレクトリを追跡しません。詳細については、Git FAQを参照してください。.gitignore
推奨される回避策は、ファイルを空のディレクトリに置くことです。.gitignore
は Unix の慣習によって「隠されている」ため、私はその解決策が好きではありません。また、ディレクトリが空である理由についても説明がありません。
ディレクトリが空である理由と Git で追跡する必要がある理由を説明する README ファイルを空のディレクトリに置くことをお勧めします。README ファイルを配置すると、Git に関する限り、ディレクトリは空ではなくなります。
本当の問題は、なぜ git に空のディレクトリが必要なのかということです。通常、コンパイル/実行する前に空のディレクトリを作成できるビルド スクリプトがあります。そうでない場合は、作成します。これは、git に空のディレクトリを配置するよりもはるかに優れたソリューションです。
したがって、git に空のディレクトリが必要な理由がいくつかあります。その理由を README ファイルに入れてください。そうすれば、他の開発者 (および将来のあなた) は、空のディレクトリが必要な理由を知ることができます。空のディレクトリを必要とする問題が解決されたら、空のディレクトリを削除できることもわかります。
すべての空のディレクトリを一覧表示するには、次のコマンドを使用します。
find -name .git -prune -o -type d -empty -print
すべての空のディレクトリにプレースホルダ README を作成するには:
find -name .git -prune -o -type d -empty -exec sh -c \
"echo this directory needs to be empty because reasons > {}/README.emptydir" \;
README ファイル以外のディレクトリ内のすべてを無視するには、次の行を .xml ファイルに追加します.gitignore
。
path/to/emptydir/*
!path/to/emptydir/README.emptydir
path/to/otheremptydir/*
!path/to/otheremptydir/README.emptydir
または、すべてのREADME ファイルが無視されないように除外することもできます。
path/to/emptydir/*
path/to/otheremptydir/*
!README.emptydir
作成済みのすべての README を一覧表示するには:
find -name README.emptydir
tmpという名前の空のディレクトリが必要だとしましょう:
$ mkdir tmp
$ touch tmp/.gitignore
$ git add tmp
$ echo '*' > tmp/.gitignore
$ git commit -m 'Empty directory' tmp
つまり、.gitignore ファイル (および空のディレクトリ内の他のすべて) を無視するように Git に指示する前に、.gitignore ファイルをインデックスに追加する必要があります。
空のディレクトリを追加することは、そのディレクトリが存在することを期待するスクリプトがあるため(おそらく、生成されたバイナリのターゲットであるため)、抵抗が最も少ないパスのように思われます。別のアプローチは、必要に応じてディレクトリを作成するようにスクリプトを変更することです。
mkdir --parents .generated/bin ## create a folder for storing generated binaries
mv myprogram1 myprogram2 .generated/bin ## populate the directory as needed
この例では、ディレクトリへの(壊れた)シンボリックリンクをチェックインして、「。generated」プレフィックスなしでアクセスできるようにすることができます(ただし、これはオプションです)。
ln -sf .generated/bin bin
git add bin
ソースツリーをクリーンアップする場合は、次のことができます。
rm -rf .generated ## this should be in a "clean" script or in a makefile
ほとんど空のフォルダをチェックインするというよく提案されるアプローチを採用する場合、「。gitignore」ファイルも削除せずにコンテンツを削除するというわずかな複雑さがあります。
ルート.gitignoreに以下を追加することにより、生成されたすべてのファイルを無視できます。
.generated
あなたはできませんし、残念ながら決してできません。これは、Linus Torvald 自身が下した決定です。彼は私たちにとって何が良いかを知っています。
私がかつて読んだどこかに暴言があります。
Re: Empty directory..を見つけましたが、別のディレクトリがあるかもしれません。
残念ながら、回避策を実行する必要があります。
私も空のディレクトリの問題に直面しています。プレースホルダー ファイルを使用する際の問題は、それらを作成し、不要になった場合は削除する必要があることです (後でサブディレクトリまたはファイルが追加されたためです。大きなソース ツリーでは、これらのプレースホルダー ファイルを管理するのが面倒でエラーになる可能性があります)。傾向がある。
これが、そのようなプレースホルダー ファイルの作成/削除を自動的に管理できるオープン ソース ツールを作成することにした理由です。.NET プラットフォーム用に作成されており、Mono (Linux 用の .NET) および Windows で動作します。
ファイルを追加するとき.gitignore
に (Git に無視させたい) 任意の量のコンテンツをそのファイルに入れる場合は、アスタリスクだけを含む 1 行を*
追加して、無視されたコンテンツを誤って追加しないようにすることをお勧めします。 .
Git にディレクトリを追跡させる方法はないため、唯一の解決策は、Git に追跡させたいディレクトリ内にプレースホルダー ファイルを追加することです。
ファイルには名前を付けて、好きなものを含めることができますが、ほとんどの人は名前付きの空のファイルを使用します.gitkeep
(ただし、VCS に依存しない方を好む人もいます.keep
)。
接頭辞.
は、それを隠しファイルとしてマークします。
もう 1 つのアイデアはREADME
、ディレクトリの用途を説明するファイルを追加することです。
前述のように、空のディレクトリを追加することはできませんが、空の .gitignore ファイルをすべてのディレクトリに追加するワンライナーを次に示します。
ruby -e 'require "fileutils" ; Dir.glob(["target_directory","target_directory/**"]).each { |f| FileUtils.touch(File.join(f, ".gitignore")) if File.directory?(f) }'
簡単にアクセスできるように、これを Rakefile に貼り付けました。
Jamie Flournoy のソリューションはうまく機能します。を維持するために少し拡張されたバージョンを次に示し.htaccess
ます。
# Ignore everything in this directory
*
# Except this file
!.gitignore
!.htaccess
このソリューションを使用すると、空のフォルダーをコミットできます。たとえば/log
、/tmp
または/cache
、フォルダーは空のままになります。
私は常に、目的のフォルダー構造をチェックしてプロジェクト内でビルドするための関数をビルドします。空のフォルダーがプロキシによってGitに保持されるため、これはこの問題を回避します。
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ですが、ほとんどの言語が同じ機能をサポートしていると確信しています。フォルダーの作成はアプリケーションによって処理されるため、フォルダーは常に存在します。
これはハックですが、機能するのは面白いです (Git 2.2.1)。@Tekaが提案したものに似ていますが、覚えやすいです:
- サブモジュールを任意のリポジトリに追加します (
git submodule add path_to_repo
) - これにより、フォルダーとファイルが追加されます
.submodules
。変更をコミットします。 - ファイルを削除
.submodules
し、変更をコミットします。
これで、コミットがチェックアウトされたときに作成されるディレクトリができました。興味深いことに、このファイルのツリー オブジェクトの内容を見ると、次のようになります。
致命的: 有効なオブジェクト名ではありません b64338b90b4209263b50244d18278c0999867193
ただし、Git の将来のバージョンでは機能しなくなる可能性があるため、使用することはお勧めしません。これにより、リポジトリが破損する可能性があります。
複数のセマンティック ディレクトリに大量の一時データを格納するフォルダーを追加する場合、1 つの方法は、ルート .gitignore に次のようなものを追加することです...
/app/data/**/*.*
!/app/data/**/*.md
次に、各ディレクトリで説明的な README.md ファイル (または空白のファイルは、この場合のように一意にターゲットにできる限り問題ありません) をコミットし*.md
て、ディレクトリがすべてリポジトリの一部のままであることを確認できますが、ファイル (拡張子付き) は無視されます。制限:.
はディレクトリ名に使用できません!
これらのすべてのディレクトリを xml/images ファイルなどで埋めて/app/data/
、アプリのストレージのニーズが高まるにつれて、さらにディレクトリを追加することができます (各ストレージ ディレクトリの目的の説明を書き込むのに役立つ README.md ファイルを使用)。まさに)。
新しいディレクトリごとに新しいディレクトリを作成して、さらに変更し.gitignore
たり分散化したりする必要はありません。.gitignore
おそらく最も賢い解決策ではありませんが、簡潔なgitignoreであり、常に私にとってはうまくいきます。シンプルでいい!;)
「実際の」空の既存のディレクトリが必要な、不適切に作成されたライブラリまたはソフトウェアに対処する必要がある場合があります。.gitignore
単純なorを置く.keep
と、それらが壊れてバグが発生する可能性があります。これらの場合、以下が役立つかもしれませんが、保証はありません...
最初に必要なディレクトリを作成します。
mkdir empty
次に、壊れたシンボリック リンクをこのディレクトリに追加します (ただし、上記の使用例以外の場合は、README
説明とともに a を使用してください)。
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 ファイルを追加するという競合する規則 (ここの多くの回答で述べられているように) を混乱させる理由も説明しています。
争いにもう1つのオプションを追加します。
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
もう 1 つのオプション (@GreenAsJade によるコメントへの応答) として、将来は追跡対象のファイルが含まれる可能性があるが、現時点では空になる空のフォルダーを追跡*
する場合は、ファイルからを省略して.gitignore
チェックインすることができます。基本的に、ファイルはすべて「私を無視しないでください」と言っていますが、それ以外の場合、ディレクトリは空で追跡されます。
ファイル.gitignore
は次のようになります。
!.gitignore
それだけです。チェックインすると、後でファイルを追跡できる、まだ追跡されている空のディレクトリが作成されます。
ファイルにその 1 行を残しておくことをお勧めする理由は、それが.gitignore
目的を与えるからです。そうしないと、誰かがそれを削除しようと考えるかもしれません。行の上にコメントを入れると役立つ場合があります。
できません。これは、Gitメンテナによる意図的な設計上の決定です。基本的に、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
readme
aまたは aを追加して.gitignore
から、ターミナルからではなく、github Web サイトから削除するだけで、空のリポジトリが作成されます。