Gitでディレクトリを追跡するがファイルは追跡しない方法は?


86

最近Gitを使い始めましたが、1つだけ問題が発生しています。内容を追跡せずにディレクトリを追跡するにはどうすればよいですか?

たとえば、私が取り組んでいるサイトではアップロードが許可されています。アップロードディレクトリを追跡して、ブランチなどで作成されるようにしたいのですが、明らかにその中のファイル(開発ブランチでのテストファイルまたはマスターでの実際のファイル)ではありません。

私の.gitignoreには、次のものがあります。

アップロード/*.*

また試しました(ディレクトリ全体を無視します):

アップロード/

このディレクトリにはサブディレクトリ(uploads / thumbs / uploads / videos /)も含まれている場合があります。これらのファイルは追跡できますが、追跡はできません。

これはGitで可能ですか?私は答えを見つけることなくどこでも検索しました。


Gitはファイルのみを追跡します。あなたができることは、gitフックをいじって、ディレクトリリスト(フックを使用して自動生成された)を含むファイルを追跡することです。それが可能かどうかは完全にはわかりませんが。
サイモン・トス

より具体的には、Gitはコンテンツを追跡し、(gitの場合)空のディレクトリはコンテンツではありません。同意するかどうかにかかわらず、議論することができますが、別の「回避策」として、ビルド/インストール/必要に応じてディレクトリを作成することを検討することもできます。ただし、「.placeholder
file

1
.placeholderを使用するのではなく、.gitignoreファイルを使用します。これは、ディレクトリ内の除外を処理するだけでなく、それ自体がプレースホルダーとして機能します。
Abizern 2011

回答:


114

Gitはディレクトリを追跡せず、ファイルを追跡するため、これを実現するには、少なくとも1つのファイルを追跡する必要があります。したがって、.gitignoreファイルが次のようになっていると仮定します。

upload/*

あなたはこれを行うことができます:

$ touch upload/.placeholder
$ git add -f upload/.placeholder

忘れた-f場合は、次のように表示されます。

$ git add upload / .placeholder
次のパスは、.gitignoreファイルの1つによって無視されます。
アップロード
本当に追加したい場合は-fを使用してください。
致命的:ファイルが追加されていません

次に、実行するgit statusと、次のように表示されます。

#ブランチマスター上
#
#初期コミット
#
#コミットする変更:
#(「gitrm --cached ...」を使用してステージングを解除します)
#
#新しいファイル:upload / .placeholder
#

明らかに、次のことができます。

$ touch upload/images/.placeholder
$ git add -f upload/images/.placeholder

おかげで、これは私が必要なものです。
ベン

11
プレースホルダーの一般的な規則は、gitignoreファイルです。
カスカベル2011

2
@Jefromi確かに、Abizernへの私のコメント.gitignoreとして、ファイルをプレースホルダーとして使用することを検討したことはありませんでした。
ピーターファーマー

1
おっと、どういうわけかそれらのコメントを逃した。
カスカベル2011

3
Gitはディレクトリを追跡しません。ディレクトリがファイルであっても、すべてがUNIXのファイルであると教えてくれると、ファイルを追跡するのはおかしいと思います
Green

38

私はこれについてここに書い

ディレクトリ内に.gitignoreを追加します。


1
素敵な小さな記事とコメント!プレースホルダーファイルとして.gitignoreを使用することを検討したことはありませんでした...–
Peter Farmer

ありがとう。投稿を書いてコメントをもらうだけで何かを学びました。
アビゼルン

1
現在使用されている一般的な命名規則があるようです.gitkeep
tarabyte 2014年

ちょうど今その「ははは」のムーメントを手に入れました、私は私が6つの異なる時間に
賛成する



6

ファイルではなくディレクトリのみを追跡するために、次のことを行いました。ファイルのみを追跡するgitに関する@PeterFarmerのコメントのおかげで、以下に説明するように、ファイルを除くすべてのディレクトリを保持することができました。

# exclude everything in every folder
/data/**/*.*

# include only .gitkeep files
!/data/**/*.gitkeep

これを.gitignoreファイルに追加すると機能します。以下は私のフォルダ構造です。

data/
├── processed
│   ├── dataset1.csv
│   └── dataset2.csv
├── raw
│   ├── raw_dataset1.json
└── test
    ├── subfolder
    │   └── dataset2.csv
    └── reviews.csv

私がそうするときgit add . && git status、gitはフォルダだけを認識し、ファイルは認識しません。

Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        modified:   .gitignore
        new file:   data/processed/.gitkeep
        new file:   data/raw/.gitkeep
        new file:   data/test/.gitkeep
        new file:   data/test/subfolder/.gitkeep

.gitignoreファイルについては次の点に注意してください。

スラッシュを前に付けると、ルートディレクトリのみが検索されます。

/ dir

二重アスタリスクは、0個以上のディレクトリを検索します。

/ ** /


ありがとうございました!私はこの方法を使用することだし、それは非常に便利です
sebasira
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.