Gitサブモジュールの追跡されていないステータスを取り除く方法は?


149

Gitのサブモジュールで追跡されていないコンテンツを取り除くことができないようです。実行中のgit status利回り:

#ブランチマスター上
#コミットのためにステージングされていない変更:
#(コミットされるものを更新するには「git add ...」を使用)
#(「git checkout-...」を使用して、作業ディレクトリの変更を破棄します)
#(サブモジュールの追跡されていない、または変更されたコンテンツをコミットまたは破棄する)
#
#変更:バンドル/抜粋(追跡されていないコンテンツ)
#変更:バンドル/サラウンド(追跡されていないコンテンツ)
#変更:bundle / trailing-whitespace(追跡されていないコンテンツ)
#変更:bundle / zencoding(追跡されていないコンテンツ)
#
コミットに変更が追加されていません(「git add」または「git commit -a」を使用してください)

--ignore-submodulesパラメータを追加すると、これらのメッセージが非表示になります。しかし、この汚れをより適切でコアっぽい方法で取り除く方法はあるのでしょうか。


3
この回答:stackoverflow.com/a/5127213/199649は、より多くのオプションを呼び起こします。
charlax 2012年

回答:


95

gitステータスは追跡されていないコンテンツを報告するため、クリーンなステータスを得る実際の方法は、これらのサブモジュールのそれぞれに移動し、次のようにすることです。

  • 追跡されていないコンテンツを追加してコミットし、
  • または、.gitignore各モジュールに固有の追跡されていないコンテンツを参照します。
  • または.git/info/excludepeci1 がコメントで報告するように、同じ無視されたコンテンツをサブモジュールに追加できます
  • または、ezraspectre回答(賛成)で述べられているように、ダーティをサブモジュール仕様に追加します。

    git config -f .gitmodules submodule.<path>.ignore untracked
    
  • または、グローバル .gitignoreファイルを追加します(多くの場合~/.gitignore-global)。例として、.DS_Storeまたは私の場合、コメントでMariánreportedernýCarthage/Buildによって報告されたようにmanページを参照してください.gitginore

ユーザーがすべての状況でGitに無視させたいパターン(たとえば、ユーザーの選択したエディターによって生成されたバックアップファイルや一時ファイル)は、通常core.excludesFile、ユーザーので指定されたファイルに入ります~/.gitconfig。デフォルト値は$XDG_CONFIG_HOME/git/ignoreです。$XDG_CONFIG_HOMEが設定されていないか空の場合は、$HOME/.config/git/ignore代わりにが使用されます。


5
+1、これが見つかるまで大声で叫ぶ準備ができていました...その後、.DS_Storeファイルが(OS Xによって)サブモジュールの1つに自動的に作成され、メインプロジェクトをコミットできないようになっていました。アーグ!更新する時間.gitignore...
コートニークリステンセン、

Xcodeを使用して、*。xcuserdatadを.gitignore-globalファイルに追加すると便利です。これにより、gitがローカルのXcode設定を追跡するのを防ぐことができます。
Roy Sharon、

サブモジュールへのプッシュ権限がない場合、サブモジュールへの変更を親リポジトリの他のユーザーと共有することはできません。@quincyglennのソリューションは、このような場合に機能するようです。
Drew Noakes 2013年

1
@VonC、どちらの答えも状況と好みに応じて理にかなっています。ここではその違いを他の人への参照として強調したかった。ところで、ここのSOでのGitに関するあなたの多くの答えに感謝します-あなたは私を何度も助けてくれました。
Drew Noakes 2013年

2
.gitignoreのコミットと作成の両方を行わなくても実行できます(それ自体は追跡されなくなります)。サブモジュールを開き、.git/info/excludeそこに無視行を追加します(.gitignoreのように機能しますが、共有リポジトリの一部ではありません)。
Martin Pecka 14

144

このブログ投稿は全体的に機能することがわかりました。ファイルignore = dirty内の各エントリにオプションを追加する.gitmodules

[submodule "zen-coding-gedit3"]
    path = zen-coding-gedit3
    url = git://github.com/leafac/zen-coding-gedit3.git
    ignore = dirty

簡単に自動化できるので、私が好むソリューション。
致命的なギター

24
これignore = untrackedも存在することに言及する価値があり、変更された追跡ファイルは表示されますが、追跡されていないファイルは表示されません。すべてのサブモジュールにこれに対するグローバル設定があったらいいですね…
naught101

12

各サブモジュールdirに移動して、個別のgitとして機能することもできます。例えば:

cd my/project/submodule
git status

... / 変更されたファイルのリストを取得します /

git add .  //to add all of them to commit into submodule
git commit -m "message to your submodule repo"

リモートサブモジュールリポジトリを次のように更新することもできます

git submodule update

結局


5
おそらくgit add .、変更されたファイルを確認せずにやりたくないでしょう。ほとんどの場合、行われた変更は追加された.DS_Storeファイルです.gitignore-zourtneyが回答への最初のコメントで言及したように、これはおそらくによってキャッチされるはずです。
gregoltsov

実際にサブモジュールを更新せずに、元の状態に戻したい場合は、を実行することをお勧めしますgit submodule update --force
トム

4

detached HEADサブモジュールブランチにある可能性があります。この場合は、サブモジュールパス(例:)に移動し./bundle/snipmate、を実行しgit checkout masterます。


2

私は昨日、12のサブモジュールに近いプロジェクトでこの問題に行き詰まりました。

git status 出力を示していました。

# On branch master
# Changes not staged for commit:
#   (use "git add ..." to update what will be committed)
#   (use "git checkout -- ..." to discard changes in working directory)
#   (commit or discard the untracked or modified content in submodules)
#
#   modified:   proj1 (untracked content)
#   modified:   proj1 (modified content, untracked content)
#   ...

追跡されていないコンテンツのエラーを解決するには、次のコマンドを使用して、追跡されていないファイルをすべてのサブモジュール(すべて*.pyc*.pyoPythonで生成されたファイル)から削除する必要がありました。.gitignore

他の問題を解決するには、git submodule update各サブモジュールを更新する実行する必要がありました。


1

私の状況では、ZF2環境で新しいモジュールの開始点としてモジュールを複製します。これにより、独自の.gitフォルダがディレクトリに配置されます。

この場合の解決策は、.gitフォルダーを削除することです(表示するには非表示のファイルを表示する必要がある可能性があります)。


1

これはおそらく、特定のフォルダ内に別の.git [隠しフォルダ]がある場合に発生します。

変更:./../ ..(変更されたコンテンツ、追跡されないコンテンツ)

サブディレクトリにこの.gitフォルダが含まれていないことを確認してください。

その場合は、サブディレクトリから手動で.gitフォルダーを削除することで問題を解決できます。


1

私はSourceTreeを使用したいので、解決策は、追跡されていないすべてのファイルのリストを表示するSourceTreeでサブモジュールリポジトリを開くことでした。次に、それらすべてをグループ化して「削除」しました。

追跡されていないファイルはすべて実際には必要ないことがわかっていたので、これを行うことができました。


1

これは私にとってはうまくいきました:

git update-index --skip-worktree <path>

で機能しない場合はpathname、ファイル名を試してください。これでも問題が解決したかどうかをお知らせください。


-1

これが一時的な問題である場合は、サブモジュールフォルダーに移動して実行git reset HEAD --hardできますが、サブモジュール内のすべての変更が失われます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.