Gitリポジトリに空のディレクトリを追加するにはどうすればよいですか。
ディレクトリを(リポジトリ内で)(ほぼ)空のままにするもう1つの方法は、次の4行を含む.gitignore
ファイルをそのディレクトリ内に作成することです。
# Ignore everything in this directory
*
# Except this file
!.gitignore
そうすると、m104の solution のように正しい順序で並べる必要はありません。
これはまた、あなたがgitステータスをしたときにそのディレクトリ内のファイルが "未追跡"として表示されないという利点も与えます。
@GreenAsJade のコメントを永続的にする:
この解決策がまさにその質問が求めていたものであることは注目に値すると思います。このソリューションはディレクトリが空のままであることを保証します。 「ここにファイルをチェックインしたくない」と書かれています。 「ここにチェックインするファイルはまだありませんが、ここにディレクトリが必要です。ファイルは後で表示される可能性があります」。
できません。 Git FAQ を参照してください。
現在、gitインデックス(ステージング領域)の設計ではファイルの一覧表示のみが許可されており、空のディレクトリを許可するように変更できるほど十分な権限を持っている人はいません。
ディレクトリはその中にファイルを追加するときに自動的に追加されます。つまり、ディレクトリをリポジトリに追加する必要はなく、独自に追跡することもありません。
あなたは "
git add <dir>
"と言うことができ、そこにファイルが追加されます。チェックアウトにディレクトリが本当に必要な場合は、その中にファイルを作成する必要があります。 .gitignoreはこの目的にはうまくいきます。空のままにしておくことも、ディレクトリに表示されるはずのファイルの名前を入力することもできます。
ディレクトリに.gitkeep
という名前の空のファイルを作成し、それを追加します。
ディレクトリにREADMEファイルを置くことができます。それ以外の場合はリポジトリに空のディレクトリを作成します。
touch .keep
Linuxでは、これは.keep
という名前の空のファイルを作成します。前者はGitにとらわれず、後者はGitに固有のものであるため、この名前は.gitkeep
よりも優先されます。第二に、他のユーザーが指摘したように、Git自身が使用するファイルとディレクトリのために.git
接頭辞規約を予約するべきです。
あるいは、別の answer に記載されているように、代わりに README
またはREADME.md
ファイル をディレクトリに含めることができます。
もちろん、これはファイルの存在があなたのアプリケーションを壊さないことを要求します。
まず最初に:
空のディレクトリは、Gitバージョン管理システムの下のツリーの一部にすることはできません。
単に追跡されません。しかし、空のディレクトリを「バージョン管理」することが意味のあるシナリオがあります。例えば:
cache/
またはlogs/
ディレクトリなどの一時ファイルのフォルダーを作成します、フォルダを提供したいが、.gitignore
その内容多くのユーザーが提案します:
README
ファイルまたは他のファイルにコンテンツを配置する、または.gitignore
ファイルを作成して、最後にアプローチ#1と同じ目的を果たす一種の「逆論理」(つまり、すべてのファイルを含める)を作成します。両方のソリューションは確実に機能しますが、Gitのバージョン管理に対する意味のあるアプローチと矛盾していることがわかります。
.gitignore
を使用して、(keepingファイル)を行う理由は、(exclusingファイル)、それは可能ですが?バージョン管理システムにフォルダを強制的に存在させるには、.gitkeep
というemptyファイルを使用します。
それほど大きな違いではないように見えるかもしれませんが:
フォルダーを保持するというsingle目的を持つファイルを使用します。あなたがそこに置きたくない情報をそこに置くことはありません。
たとえば、フォルダを保持する言い訳としてではなく、有用な情報を備えたREADMEとしてREADMEを使用する必要があります。
懸念の分離は常に良いことであり、.gitignore
を追加して不要なファイルを無視することもできます。
.gitkeep
という名前を付けると、ファイル名自体から(および他の開発者に対しても非常に明確かつ簡単になります。これは、共有プロジェクトと、 Gitリポジトリ)このファイルは
Laravel 、 Angular-CLI のような非常に重要なフレームワークで採用されている.gitkeep
アプローチを見てきました。
他の回答で説明されているように、Gitはそのステージング領域で空のディレクトリを表すことができません。 ( Git FAQ を参照してください。)ただし、.gitignore
ファイルだけが含まれているディレクトリが十分空の場合は、次の方法でのみ空のディレクトリに.gitignore
ファイルを作成できます。
find . -type d -empty -exec touch {}/.gitignore \;
Andy Lesterは正しいですが、あなたのディレクトリが empty emptyでなく、空である必要がある場合は、回避策として空の.gitignore
ファイルをそこに入れることができます。
余談ですが、これは実装の問題であり、基本的なGitストレージ設計の問題ではありません。 Gitメーリングリストで何度も述べられてきたように、これが実装されていないのは、パッチを提出するのに十分な世話をしている人がいないためです。
Ruby on Rails logフォルダの作成方法:
mkdir log && touch log/.gitkeep && git add log/.gitkeep
これでログディレクトリがツリーに含まれます。デプロイするときにとても便利なので、ログディレクトリを作るためのルーチンを書く必要はありません。
ログファイルは、
echo log/dev.log >> .gitignore
しかし、あなたはおそらくそれを知っていました。
Gitは空のディレクトリを追跡しません。さらなる説明は Git FAQ を参照してください。推奨される回避策は、空のディレクトリに.gitignore
ファイルを配置することです。 .gitignore
はUnixの慣習では「隠されている」ので、私はその解決策が好きではありません。なぜディレクトリが空なのかについての説明もありません。
空のディレクトリにREADMEファイルを配置して、そのディレクトリが空である理由とGitで追跡する必要がある理由を説明することをお勧めします。 Gitに関する限り、READMEファイルが配置されていれば、ディレクトリは空ではなくなります。
本当の質問は、なぜあなたはgitの空のディレクトリが必要なのですか?通常、コンパイル/実行の前に空のディレクトリを作成することができるある種のビルドスクリプトがあります。そうでなければそれから1を作りなさい。これは、空のディレクトリを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ファイル以外のディレクトリ内のすべてを無視するには、.gitignore
に次の行を追加します。
path/to/emptydir/*
!path/to/emptydir/README.emptydir
path/to/otheremptydir/*
!path/to/otheremptydir/README.emptydir
あるいは、 every READMEファイルを無視しないようにすることもできます。
path/to/emptydir/*
path/to/otheremptydir/*
!README.emptydir
すべてのREADMEがすでに作成された後にそれらを一覧表示するには、次の手順を実行します。
find -name README.emptydir
警告:このTweakは実際にはうまく機能しません。ご不便をおかけして申し訳ありません。
下記の元の投稿:
Gitの内部で遊んでいる間に解決策を見つけました!
空のディレクトリを作成してください。
$ mkdir path/to/empty-folder
配管コマンドと空のツリーを使用してインデックスに追加します SHA-1 :
$ git update-index --index-info
040000 tree 4b825dc642cb6eb9a060e54bf8d69288fbee4904 path/to/empty-folder
コマンドを入力してから2行目を入力します。押す Enter その後 Ctrl + D 入力を終了します。注:形式はモード[SPACE]type[SPACE] SHA-1ハッシュ[ TAB]パス(タブは重要です。回答のフォーマットでは保持されません)。
それでおしまい!空のフォルダはインデックスにあります。コミットするだけです。
この解決方法は短く、見かけ上はうまく機能します(EDIT!を参照)、しかし覚えておくのはそれほど簡単ではありません...
空のツリーSHA-1は、新しい空のGitリポジトリcd
を作成し、空のツリーSHA-1を出力するgit write-tree
を発行することで見つけることができます。
編集:
私はそれを見つけてからこのソリューションを使ってきました。モジュールがどこにも定義されていないことを除けば、サブモジュールの作成とまったく同じように機能するようです。これはgit submodule init|update
の発行時にエラーになります。問題は、git update-index
が040000 tree
部分を160000 commit
に書き換えることです。
さらに、そのパスの下に置かれたファイルは、他のリポジトリに属していると思われるため、Gitに気付かれることは決してありません。見過ごされがちなので、これは厄介です。
しかし、あなたのリポジトリでまだGitサブモジュールを使っていない(そして使わない)なら、 "empty"フォルダは空のままにしておくか、Gitにその存在を知らせてその内容を無視させたいなら、この微調整。サブモジュールで通常のやり方をすることはこのTweakより多くのステップを踏みます。
空のディレクトリを追加すると、そのディレクトリが存在することを想定したスクリプトがあるため(生成されたバイナリのターゲットになる可能性があるため)、最小の抵抗のパスになるようです。別の方法は スクリプトを修正して必要に応じてディレクトリを作成することです 。
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"ファイルも削除せずにコンテンツを削除するという複雑な作業が少しあります。
Rootの.gitignoreに以下を追加することで、生成されたファイルをすべて無視することができます。
.generated
tmp という名前の空のディレクトリが必要だとしましょう。
$ mkdir tmp
$ touch tmp/.gitignore
$ git add tmp
$ echo '*' > tmp/.gitignore
$ git commit -m 'Empty directory' tmp
言い換えると、Gitにそれを無視するように指示する前に(そして空のディレクトリにある他のすべてのものに)、.gitignoreファイルをインデックスに追加する必要があります。
私は空のディレクトリでも問題に直面しています。プレースホルダファイルを使用することの問題は、それらが必要でなくなった場合、それらを作成して削除する必要があることです(後でサブディレクトリまたはファイルが追加されたため)傾向があります。
そのため、このようなプレースホルダファイルの作成/削除を自動的に管理できるオープンソースツールを作成することにしました。これは.NETプラットフォーム用に書かれており、Mono(Linux for .NET)およびWindowsで動作します。
ちょっと見てください: http://code.google.com/p/markemptydirs
あなたはできませんし、残念ながらできないでしょう。これはLinus Torvald自身による決定です。彼は私たちにとって何が良いのかを知っています。
私が一度読んだどこかにそこに外傷があります。
Re:Empty directories ..が見つかりましたが、別のものがあるかもしれません。
あなたは回避策を持って生きなければなりません...残念ながら。
.gitignore
ファイルを追加するとき、その中に任意の量のコンテンツを入れる場合(Gitに無視させたい)、無視されないファイルを追加しないようにするためにアスタリスク*
を1行追加することをお勧めします。誤って内容。
@ Artur79と@mjsの回答が気に入っているので、両方を組み合わせて使用し、それを私たちのプロジェクトの標準にしました。
find . -type d -empty -exec touch {}/.gitkeep \;
しかし、私たちの開発者のほんの一握りだけがMacまたはLinuxで作業しています。多くのことがWindows上で動作しますが、私はそこで同じことを達成するための同等の単純なワンライナーを見つけることができませんでした。他の理由で Cygwin がインストールされているほど幸運だった人もいますが、Cygwinを処方するだけではやり過ぎです。
より良い解決策のために編集しなさい
ですから、私たちの開発者のほとんどはすでに Ant をインストールしているので、最初に考えたのはAntビルドファイルをまとめてプラットフォームとは無関係にこれを実現することです。これはまだ見つかりません ここ
しかし 、後でこれを小さなユーティリティコマンドにする方が良いと思うので、Pythonを使って再作成してPyPIに公開しました here 。あなたは単に実行することによってそれをインストールすることができます。
pip3 install gitkeep2
それはあなたが.gitkeep
ファイルを再帰的に作成したり削除したりすることを可能にし、またそれらのディレクトリがなぜ重要であるかをあなたの仲間が理解できるようにそれらにメッセージを追加することを可能にします。この最後のビットはボーナスです。 .gitkeep
ファイルが自己文書化できるものであればいいと思いました。
$ gitkeep --help
Usage: gitkeep [OPTIONS] PATH
Add a .gitkeep file to a directory in order to Push them into a Git repo
even if they're empty.
Read more about why this is necessary at: https://git.wiki.kernel.org/inde
x.php/Git_FAQ#Can_I_add_empty_directories.3F
Options:
-r, --recursive Add or remove the .gitkeep files recursively for all
sub-directories in the specified path.
-l, --let-go Remove the .gitkeep files from the specified path.
-e, --empty Create empty .gitkeep files. This will ignore any
message provided
-m, --message TEXT A message to be included in the .gitkeep file, ideally
used to explain why it's important to Push the specified
directory to source control even if it's empty.
-v, --verbose Print out everything.
--help Show this message and exit.
私はあなたがそれが役に立つと思うことを願っています。
Jamie Flournoyの解決策 はうまくいきます。これは.htaccess
を保持するための少し強化されたバージョンです:
# Ignore everything in this directory
*
# Except this file
!.gitignore
!.htaccess
このソリューションでは、/log
、/tmp
、/cache
などの空のフォルダーをコミットでき、そのフォルダーは空のままになります。
すでに述べたように、空のディレクトリを追加することはできませんが、空の.gitignoreファイルをすべてのディレクトリに追加する1つのライナーがあります。
Ruby -e 'require "fileutils" ; Dir.glob(["target_directory","target_directory/**"]).each { |f| FileUtils.touch(File.join(f, ".gitignore")) if File.directory?(f) }'
簡単にアクセスできるように、これをRakefileに貼り付けました。
これがハックですが、うまくいくのは面白いことです(Git 2.2.1)。 @Tekaが提案したものと似ていますが、覚えやすいです:
git submodule add path_to_repo
).submodules
が追加されます。変更を確定します。.submodules
ファイルを削除して変更を確定します。これで、コミットがチェックアウトされたときに作成されるディレクトリができました。興味深いことに、このファイルのツリーオブジェクトの内容を見ると以下のようになります。
fatal:無効なオブジェクト名です。b64338b90b4209263b50244d18278c0999867193
Gitの将来のバージョンでは動作しなくなる可能性があるので、私はそれを使用することをお勧めしません。リポジトリが破損している可能性があります。
Gitにディレクトリを追跡させる方法はないので、唯一の解決策はGitに追跡させたいプレースホルダファイルをディレクトリ内に追加することです。
ファイルには任意の名前を付けて好きなものを含めることができますが、ほとんどの人は.gitkeep
という名前の空のファイルを使用します(ただし、VCSにとらわれない.keep
を好む人もいます)。
接頭辞.
は隠しファイルとしてマークします。
もう1つのアイデアは、ディレクトリの用途を説明するREADME
ファイルを追加することです。
私はいつも自分の望むフォルダ構造をチェックしてプロジェクト内で自分のためにそれを構築するための関数を構築します。空のフォルダはプロキシによって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にありますが、ほとんどの言語が同じ機能をサポートしていると確信しています、そしてフォルダーの作成はアプリケーションによって処理されるので、フォルダーは常にそこにあるでしょう。
複数のセマンティックディレクトリに大量の一時的なデータを格納するフォルダを追加したい場合は、ルートの.gitignoreに次のようなものを追加するという方法があります。
/app/data/**/*.* !/app/data/**/*.md
それから、ディレクトリがすべてリポジトリの一部であることを確実にするために、それぞれのディレクトリに記述的なREADME.mdファイル(またはこの場合は*.md
のように一意にそれらをターゲットにできる限り空のファイル)をコミットできます。ファイル(拡張子付き)は無視されます。制限:.
はディレクトリ名に使用できません。
あなたのアプリのために必要なストレージが増えるにつれて、これらすべてのディレクトリをxml/imagesファイルなどでいっぱいにして/app/data/
の下にディレクトリを追加することができます(README.mdファイルはそれぞれのストレージディレクトリの説明正確に)。
新しいディレクトリごとに新しい.gitignore
を作成して、.gitignore
をさらに変更したり、分散化したりする必要はありません。おそらく最も賢い解決策ではありませんが、簡潔なgitignore-賢明で常に私のために働きます。素敵でシンプル! ;)
できません。これはGitメンテナによる意図的な設計上の決定です。基本的に、Gitのようなソースコード管理システムの目的はソースコードを管理することであり、空のディレクトリはソースコードではありません。 Gitはしばしばコンテンツトラッカーとも呼ばれています。また、空のディレクトリはコンテンツではありません(実際はまったく反対)ので、追跡されません。
争いにもう一つの選択肢を加える。
git
に関連するすべての目的のために、空のままにしてその内容を追跡しないようにするディレクトリをgit
に追加したいとすると、ここで何度も提案されている.gitignore
がうまくいくでしょう。
前述のとおり、形式は次のとおりです。
*
!.gitignore
さて、あなたがコマンドラインでこれをする方法が欲しいなら、すぐに、あなたが追加したいディレクトリにinsideを実行することができます:
$ 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によるコメントに応えて)、将来追跡されるファイルを含む{MAY}という空のフォルダを追跡したいが、今のところ空になる場合は、*
を省略できます。 .gitignore
ファイルから、that inをチェックしてください。基本的に、すべてのファイルは「meを無視しないでください」と言っていますが、それ以外の場合、ディレクトリは空で追跡されます。
.gitignore
ファイルは次のようになります。
!.gitignore
それで、それをチェックインすれば、あとでファイルを追跡できる空の、まだ追跡されているディレクトリがあります。
ファイル内のその1行を保持することをお勧めするのは、それが.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 answer を参照してください。これは、.gitignoreファイルを追加するという競合する慣習(ここの多くの回答に記載されている)が混乱を招く理由も説明しています。
「コンテンツ」と見なされるファイルのみを含むフォルダーがあるリポジトリがある場合があります。つまり、それらはバージョン管理されることを気にするファイルではないため、コミットされるべきではありません。 Gitの.gitignoreファイルを使えば、ディレクトリ全体を無視することができます。しかし、レポジトリにフォルダを置くことが有益な場合があります。これは、このニーズを達成するための優れた解決策です。
私が過去にやったことは、レポジトリのルートに.gitignoreファイルを置いて、フォルダを除外することです。
/app/some-folder-to-exclude
/another-folder-to-exclude/*
ただし、これらのフォルダはリポジトリの一部にはなりません。そこにREADMEファイルのようなものを追加することができます。しかしその場合は、READMEファイルの処理を心配しないようにアプリケーションに指示する必要があります。
アプリケーションがそこにあるフォルダに依存している場合(空であっても)、問題のフォルダに.gitignoreファイルを追加して、それを使用して2つの目的を達成することができます。
Gitにフォルダ内にファイルがあることを伝えます。これによりGitはリポジトリにファイルを追加します。このファイル自体を除いた、このフォルダの内容を無視するようにGitに指示します。これは空のディレクトリの中に置くための.gitignoreファイルです:
*
!.gitignore
最初の行(*)はGitにこのディレクトリの全てを無視するように伝えます。 2行目は、Gitに.gitignoreファイルを無視しないように指示します。リポジトリに追加したいすべての空のフォルダにこのファイルを詰め込むことができます。
このコードを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}