空のディレクトリ(ファイルを含まない)をGitリポジトリに追加するにはどうすればよいですか?
空のディレクトリ(ファイルを含まない)をGitリポジトリに追加するにはどうすればよいですか?
回答:
(リポジトリ内で)ディレクトリを(ほとんど)空のままにする別の方法.gitignore
は、次の4行を含むディレクトリ内にファイルを作成することです。
# Ignore everything in this directory
*
# Except this file
!.gitignore
次に、m104のソリューションで行う必要がある方法で正しい順序を取得する必要はありません。
これにより、gitステータスを実行したときに、そのディレクトリ内のファイルが「追跡されていない」ものとして表示されないという利点もあります。
作る@GreenAsJadeのコメント永続:
この解決策は質問が要求したことを正確に実行することは注目に値しますが、おそらくこの質問を見ている多くの人々が探していたものではないでしょう。このソリューションは、ディレクトリが空のままであることを保証します。「ここにファイルをチェックインしたくない」と書いてある。「ここにチェックインするファイルはまだありませんが、ここにディレクトリが必要です。後でファイルが来る可能性があります」とは対照的です。
README
内に配置するドキュメントを書き.gitignore
ます。
現在、gitインデックス(ステージング領域)の設計では、ファイルのリストのみを許可しており、空のディレクトリを許可するように変更を行うのに十分な能力を持つ人は、この状況を修正するのに十分注意していません。
ディレクトリは、その中にファイルを追加すると自動的に追加されます。つまり、ディレクトリをリポジトリに追加する必要はなく、単独で追跡されることもありません。
「
git add <dir>
」と言うと、そこにファイルが追加されます。チェックアウトに存在するディレクトリが本当に必要な場合は、その中にファイルを作成する必要があります。.gitignoreはこの目的に適しています。空のままにするか、ディレクトリに表示される予定のファイルの名前を入力できます。
git mv
、gitは新しいディレクトリがバージョン管理されていないと文句を言うので、彼らはそれを実行できません
.gitkeep
この目的のために呼び出された空のファイルを使用する多くのリポジトリを見てきました。
.gitkeep
ディレクトリに空のファイルを作成し、それを追加します。
.keep
。
.gitkeep
はGitで規定されておらず、人々がその意味を2番目に推測するようになり、その結果、Google検索につながり、ここで彼らを導きます。.git
接頭辞規則は、Gitの自体が使用するファイルやディレクトリのために確保されなければなりません。
.git
プレフィックス規約は予約する必要があります...」なぜですか?gitはこの予約を要求しますか?
README
またはABOUT
ファイルは同じかそれ以上です。URLの前に私たち全員が行っていたように、次の人にメモを残します。
リポジトリにREADMEファイルを置く理由を説明したREADMEファイルを、いつでも空にすることができます。
touch .keep
Linuxでは、これはという名前の空のファイルを作成します.keep
。価値があるので、この名前はGitに依存し.gitkeep
ませんが、Gitに固有です。第二に、別のユーザーが指摘したように、.git
Git自体が使用するファイルとディレクトリのために接頭辞規則を予約する必要があります。
または、別の回答に記載されているように、ディレクトリには代わりに説明README
またはREADME.md
ファイルを含めることができます。
もちろん、これにはファイルの存在によってアプリケーションが壊れないことが必要です。
.keep
ファイルを削除するか、単に無視します。代わりに、ディレクトリ内のファイルを無視する場合は、まったく別の問題です。
git clean -nd | sed s/'^Would remove '// | xargs -I{} touch "{}.keep"
追跡されていないすべての空のディレクトリでこれを行うことが提案されました。
まず最初に:
空のディレクトリをGitバージョン管理システムのツリーの一部にすることはできません。
それは単に追跡されません。ただし、次の例のように、空のディレクトリの「バージョン管理」が意味を持つシナリオがあります。
cache/
またはlogs/
私たちは、フォルダが、提供したいディレクトリ、.gitignore
その内容を多くのユーザーからの提案:
README
ディレクトリを空にしないために、コンテンツを含むファイルまたは別のファイルを配置する、または.gitignore
「逆の論理」の一種で、ファイルを最後に、アプローチ#1の同じ目的を果たしている、(すなわち、すべてのファイルを含めます)。一方で、両方のソリューションが確実に動作し、私はバージョン管理Gitリポジトリに意味のあるアプローチでそれら矛盾を見つけます。
.gitignore
物事をするのに使うのか(それが可能であるにもかかわらず、それが意図していること(ファイルを除外すること)とは正反対のファイルを保持すること)ですか?を使用 .gitkeep
バージョン管理システムにフォルダが存在するように強制するために呼び出される空のファイルをます。
それはそれほど大きな違いではないように見えるかもしれませんが:
あなたが持っているファイルを使用します フォルダーを保持する単一の目的します。あなたが置きたくない情報はそこには入れません。
たとえば、フォルダを保持するための言い訳としてではなく、有用な情報が含まれているREADMEも使用する必要があります。
懸念の分離は常に良いことであり、 .gitignore
不要なファイルを無視をます。
名前を付けると.gitkeep
、ファイル名自体から(そして他の開発者にとっても)非常に明確かつ簡単になりますにとっても、共有プロジェクトおよびGitリポジトリの主要な目的の1つに適しています)から、このファイルは
LaravelやAngular-CLI.gitkeep
などの非常に重要なフレームワークで採用されているアプローチを見てきました。
.gitkeep
して、他のgit接頭辞のないファイル名に置き換えると、私の賛成票が得られますが、これが最良で最も有益な答えだと思います。理由:これは単なるプレースホルダーですが、「。git *」はgitの規定ファイル用に予約する必要があると思います。私が最初にそれを目にしたのは、たとえば ".gitkeep"ファイルは自動的に無視される(すばらしい機能です)と思いますが、そうではありません。
他の回答で説明されているように、Gitはステージング領域で空のディレクトリを表すことができません。(Git FAQを参照してください。)ただし、目的のために、.gitignore
ファイルのみが含まれているディレクトリが十分に空である場合、次の.gitignore
方法でのみ空のディレクトリにファイルを作成できます。
find . -type d -empty -exec touch {}/.gitignore \;
find . -name .git -prune -o -type d -empty -exec touch {}/.gitignore \;
find * -type d -empty -exec touch {}/.gitignore \;
find . -name .DS_Store -exec rm {} \;
から、この回答から優先バリアントを使用することでした。正しいフォルダでのみ実行してください!
.gitignore
ても-empty
、find
コマンドのフラグには影響しません。私のコメントは.DS_Store
、ディレクトリツリー内のファイルを削除することですので、-empty
フラグを適用できます。
アンディ・レスターは正しいですが、あなたのディレクトリは単に空である必要があり、そうでない場合、空の空、空を置くことができます.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の慣例によって「隠されいる」。また、ディレクトリが空である理由も説明されていません。
READMEファイルを空のディレクトリに配置して、ディレクトリが空である理由とGitで追跡する必要がある理由を説明することをお勧めします。READMEファイルを配置すると、Gitに関する限り、ディレクトリは空ではなくなります。
本当の質問は、なぜ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
または、すべての READMEファイルを無視しないように除外することもできます。
path/to/emptydir/*
path/to/otheremptydir/*
!README.emptydir
作成後にすべてのREADMEをリストするには:
find -name README.emptydir
警告:この調整は、実際には機能していません。ご不便おかけしてすみません。
以下の元の投稿:
Gitの内部で遊んでいるときに解決策を見つけました!
空のディレクトリを作成します。
$ mkdir path/to/empty-folder
配管コマンドと空のツリーSHA-1を使用して、インデックスに追加します。
$ git update-index --index-info
040000 tree 4b825dc642cb6eb9a060e54bf8d69288fbee4904 path/to/empty-folder
コマンドを入力してから、2行目を入力します。押しEnterた後、Ctrl+ Dあなたの入力を終了します。注:形式はモード [スペース] タイプ [スペース] SHA-1ハッシュ[タブ]パスです(タブは重要です。回答のフォーマットでは保持されません)。
それでおしまい!空のフォルダがインデックスにあります。あなたがしなければならないすべてはコミットです。
このソリューションは短く、明らかにうまく機能します(編集を参照してください!)が、覚えるのはそれほど簡単ではありません...
空のツリーSHA-1を見つけるには、新しい空のGitリポジトリをその中に作成し、空のツリーSHA-1を出力するcd
を発行git write-tree
します。
編集:
このソリューションを見つけてからずっと使っています。どこにもモジュールが定義されていないことを除いて、サブモジュールの作成とまったく同じように機能するようです。これにより、発行時にエラーが発生しgit submodule init|update
ます。問題はgit update-index
、040000 tree
パーツをに書き換えること160000 commit
です。
さらに、そのパスの下に置かれたファイルは、他のリポジトリに属していると見なされるため、Gitによって認識されることはありません。これは簡単に見落とされる可能性があるため、厄介です!
ただし、リポジトリでGitサブモジュールをまだ使用していない(そして使用しない)場合、「空の」フォルダーは空のままになるか、Gitがその存在を認識してその内容を無視するようにしたい場合は、この微調整。サブモジュールを通常の方法で使用するには、この微調整よりも多くの手順が必要です。
git svn dcommit
、希望の結果でそれを行うことは可能ですか?
tmpという名前の空のディレクトリが必要だとします。
$ mkdir tmp
$ touch tmp/.gitignore
$ git add tmp
$ echo '*' > tmp/.gitignore
$ git commit -m 'Empty directory' tmp
言い換えると、Gitにそれ(および空のディレクトリ内の他のすべて)を無視するように指示する前に、.gitignoreファイルをインデックスに追加する必要があります。
echo bla > file
、あなたが得ることはありませんfile: File exists
ので>
、それはすでにあります場合は、ファイルを上書きするか、それが存在しない場合は新規に作成されます。
/bin/sh
文化的仮定!*「ここ」がcsh
あり、変数noclobber
が設定されている場合、実際に取得されfile: File exists
ます。誰かが「私はこれを手に入れました」と言った場合、彼らがバカだと思い込まず、「いいえ、あなたはしません」と答えます。* c2.com/cgi/wiki?AmericanCulturalAssumption
空のディレクトリの追加は、そのディレクトリが存在することを期待するスクリプトがあるため(おそらく生成されたバイナリのターゲットであるため)、抵抗が最も少ないパスのように思われます。別のアプローチは、スクリプトを変更して、必要に応じてディレクトリを作成することです。
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
.generated
は、最初はディレクトリが存在しないため、クリーンチェックアウトでは「壊れています」。ビルドを行っても壊れることはありません。
私も空のディレクトリの問題に直面しています。プレースホルダーファイルを使用する場合の問題は、それらを作成し、不要になった場合は削除する必要があることです(後でサブディレクトリやファイルが追加されたためです)。大きなソースツリーを使用すると、これらのプレースホルダーファイルを管理するのが面倒でエラーになる可能性があります。腹痛。
そのため、このようなプレースホルダーファイルの作成/削除を自動的に管理できるオープンソースツールを作成することにしました。.NETプラットフォーム用に作成され、Mono(Linuxの場合は.NET)とWindowsで動作します。
@ Artur79と@mjsの回答が気に入ったので、両方を組み合わせて使用し、プロジェクトの標準にしました。
find . -type d -empty -exec touch {}/.gitkeep \;
ただし、MacまたはLinuxで作業している開発者はごくわずかです。Windowsでは多くの作業が行われ、そこで同じことを達成するための同等のシンプルなワンライナーを見つけることができませんでした。他の理由でCygwinをインストールできる幸運な人もいましたが、これだけのためにCygwinを処方するのはやり過ぎに思えました。
より良いソリューションのために編集する
ですから、ほとんどの開発者はすでにAntをインストールしているので、私が最初に考えたのは、Antビルドファイルをまとめて、これをプラットフォームとは独立して実現することでした。これはまだ見つかりますここにあります
ただし、後でこれを小さなユーティリティコマンドにした方がよいと思ったので、Pythonを使用して再作成し、ここのPyPIに公開しました。次のコマンドを実行するだけでインストールできます。
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.
お役に立てば幸いです。
できませんし、残念ながらできません。これは、Linus Torvald自身が行った決定です。彼は私たちにとって何が良いのかを知っています。
私が一度読んだどこかに暴言があります。
私はRe:空のディレクトリを見つけました..、しかし別のディレクトリがあるかもしれません。
あなたは回避策と一緒に生きなければなりません...残念ながら。
.gitignore
ファイルを追加するときに、Gitに無視させたいコンテンツをいくらか入れようとする場合は、アスタリスクだけの1行を*
追加して、無視したコンテンツを誤って追加しないようにすることができます。 。
前述のとおり、空のディレクトリを追加することはできませんが、空の.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に貼り付けました。
find . -type d -empty -print0 | xargs --null bash -c 'for a; do { echo "*"; echo "!.gitignore"; } >>"$a/.gitignore"; done' --
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にありますが、ほとんどの言語が同じ機能をサポートしていると思います。フォルダーの作成はアプリケーションによって処理されるため、フォルダーは常にそこにあります。
.gitkeep
大会は、はるかに良い習慣です。
これはハックですが、機能するのはおかしいです(Git 2.2.1)。@Tekaが提案したものに似ていますが、覚えやすいです:
git submodule add path_to_repo
).submodules
。変更をコミットします。.submodules
ファイルを削除し、変更をコミットします。これで、コミットがチェックアウトされたときに作成されるディレクトリができました。興味深いのは、このファイルのツリーオブジェクトのコンテンツを見ると、次のようになることです。
致命的:無効なオブジェクト名b64338b90b4209263b50244d18278c0999867193
Gitの将来のバージョンでは動作しなくなる可能性があるため、私はそれを使用することをお勧めしません。リポジトリが壊れたままになる可能性があります。
多くの人がすでにこの質問に答えています。ここに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}
複数のセマンティックディレクトリに多くの一時データを格納するフォルダーを追加する場合、1つのアプローチは、ルート.gitignoreに次のようなものを追加することです...
/app/data/**/*.*
!/app/data/**/*.md
次に*.md
、各ディレクトリで説明的なREADME.mdファイル(または、空のファイルでも構いません)を各ディレクトリにコミットして、すべてのディレクトリがリポジトリの一部であることを確認できますが、ファイル(拡張子付き)は無視されます。制限:.
はディレクトリ名に使用できません!
これらのすべてのディレクトリをxml / imagesファイルなどで埋め、さらにディレクトリを追加することができます。 /app/data/
、アプリのストレージニーズが発展するにつれて、時間の経過とともにます(README.mdファイルは、各ストレージディレクトリの目的の説明を書き込むために役立ちます)丁度)。
新しいディレクトリごとに新しいディレクトリを.gitignore
作成することで、さらに変更したり分散化したりする必要はありません.gitignore
。おそらく最も賢い解決策ではありませんが、簡潔なgitignore-wiseであり、常に私のために機能します。素敵でシンプル!;)
ほつれにもう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
あなたがいることを空のフォルダを追跡したい場合(@GreenAsJadeによってコメントに応答して)別のオプションは、MAYは将来的に追跡されたファイルが含まれていますが、今のところは空になりますが、あなたはOMMITできる*
から.gitignore
、ファイル、およびチェックすることをインチ基本的に、ファイルが言っているすべては「私を無視しないでください」、それ以外の場合、ディレクトリは空で追跡されます。
あなたの.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ファイルシステムで機能するかどうかはわかりません...)
読み込み@ofavreをさんと@スタニスラフ・bashkyrtsev GITのディレクトリを作成するために、壊れたGITサブモジュールの参照を使用しての答えを、私は誰も全体のことを正気と安全を作るためのアイデアを、まだこの簡単な修正を示唆していないことに驚いています:
偽のサブモジュールをGITにハッキングするのではなく、空の実際のサブモジュールを追加するだけです。
コミットが1つだけのGITリポジトリ:
commit e84d7b81f0033399e325b8037ed2b801a5c994e0
Author: Nobody <none>
Date: Thu Jan 1 00:00:00 1970 +0000
メッセージなし、コミットされたファイルなし。
空のディレクトリをGITリポジトリに追加するには:
git submodule add https://gitlab.com/empty-repo/empty.git path/to/dir
既存の空のディレクトリをすべてサブモジュールに変換するには:
find . -type d -empty -delete -exec git submodule add -f https://gitlab.com/empty-repo/empty.git \{\} \;
Gitはサブモジュール参照を作成するときに最新のコミットハッシュを保存するため、私(またはGitLab)がこれを使用して悪意のあるファイルを挿入することを心配する必要はありません。残念ながら、チェックアウト時にどのコミットIDを使用するかを強制する方法が見つからなかったため、参照コミットIDがe84d7b81f0033399e325b8037ed2b801a5c994e0
使用していることを手動で確認する必要がありますgit submodule status
、リポジトリを追加後れていること。
まだ、ネイティブのソリューションが、我々は、おそらく誰かが手を得ることなく持つことができる最高の本当に、本当に GITのコードベースで汚いです。
あなたは(空のディレクトリで)を使用してこの正確なコミットを再作成できるはずです:
# Initialize new GIT repository
git init
# Set author data (don't set it as part of the `git commit` command or your default data will be stored as “commit author”)
git config --local user.name "Nobody"
git config --local user.email "none"
# Set both the commit and the author date to the start of the Unix epoch (this cannot be done using `git commit` directly)
export GIT_AUTHOR_DATE="Thu Jan 1 00:00:00 1970 +0000"
export GIT_COMMITTER_DATE="Thu Jan 1 00:00:00 1970 +0000"
# Add root commit
git commit --allow-empty --allow-empty-message --no-edit
再現可能なGITコミットの作成は驚くほど難しい…
できません。これは、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
checkout
ただし、現在のバージョンのGit には対応していません。