追跡されていないコンテンツを追跡する方法は?


159

元の質問については、実線の下を参照してください。

ローカルディレクトリに追跡されていないフォルダーがあります。を実行するとgit status、次のようになります。

Changed but not updated:
modified:   vendor/plugins/open_flash_chart_2 (modified content, untracked content)

入力してgit add vendor/plugins/open_flash_chart_2もう一度試すgit statusと、「追跡されていません」と表示されます。どうしたの?


ここに私の最新の30分の簡単な要約があります:

  • Githubリポジトリがvendor/plugins/open_flash_chart_2プラグインを追跡していないことがわかりました。具体的には、コンテンツがなく、フォルダアイコンに緑色の矢印が表示されています。

  • 試しました git submodule init

    No submodule mapping found in .gitmodules for path 'vendor/plugins/open_flash_chart_2'
    
  • 試しました git submodule add git://github.com/korin/open_flash_chart_2_plugin.git vendor/plugins/open_flash_chart_2

    vendor/plugins/open_flash_chart_2 already exists in the index
    
  • git status

    modified: vendor/plugins/open_flash_chart_2 (untracked content)
    
  • .gitmodules私のリポジトリ/ローカルディレクトリで指定されたファイルを探しましたが、見つかりませんでした。

gitが適切に追跡を開始できるように、サブモジュールを機能せるにはどうすればよいですか?


これは無関係である可能性がありますが(役立つ場合は含めます)、git commit -a通常git commit -m "my comments"ではなく入力するたびにエラーがスローされます。

E325: ATTENTION
Found a swap file by the name ".git\.COMMIT-EDITMSG.swp"
         dated: Thu Nov 11 19:45:05 2010
     file name: c:/san/project/.git/COMMIT_EDITMSG
      modified: YES
     user name: San   host name: San-PC
    process ID: 4268
While opening file ".git\COMMIT_EDITMSG"
         dated: Thu Nov 11 20:56:09 2010
  NEWER than swap file!  
Swap file ".git\.COMMIT_EDITMSG.swp" already exists!
[O]pen Read-Only, (E)dit anyway, (R)ecover, (D)elete it, (Q)uit, (A)bort:
Swap file ".git\.COMMIT_EDITMSG.swp" already exists!
[O]pen Read-Only, (E)dit anyway, (R)ecover, (D)elete it, (Q)uit, (A)bort:

私はGithubの完全な初心者です。ドキュメントを読み込もうとしたにもかかわらず、これらの特定の問題に少し困惑しています。ありがとうございました。


2
いくつか混乱しています。1つ:なぜgithubと言い続けるのですか?あなたが話しているすべてのものはローカルに聞こえます(緑色の矢印を除いて-私はそれについて何も知りません)。それは正しいですか、それとも更新をgithubにプッシュすることについての質問ですか?2つ目:このプラグインをサブモジュールとして作成するために実際に何かしましたか?サブモジュールは、それ自体がgitリポジトリです。個別に作成してから、スーパープロジェクトに追加します。
Cascabel 2010年

1
ええと、git statusの出力は確かにそこにサブモジュールがあることを示唆しています...しかし、あなたは本当に.gitmodulesファイルを持っていませんか?このプラグインは独自のレポを持っており、あなたが何をしたい、それのバージョンを知っていれば、正直なところ、あなただけの、あなたのプロジェクトから、そのディレクトリを削除してください.gitmodulesにエントリがありません作り、およびサブモジュールのセットアップを行くことができます:git submodule addgit submodule update --init
Cascabel 2010年

Jefromi-私は実際にGithubについて2回以上言及していません。最初の原因は、open_flash_chart_2の実際のGithubリポジトリの黄色のフォルダーイメージの上に緑色の矢印が表示されるためです。答えをわかりやすく編集して、わかりやすくします。
sscirrus

1
@sscirrus:あなたは間違いなく好み、サブモジュールを持っているべきです。これがあなたが取り組むつもりのない外部のものであるが、あなたがアップデートを望むかもしれないものであるなら、それはサブモジュールであるべきです。元のリポジトリから更新を取得する必要がなく、ソースを自分でハッキングしたい場合は、サブモジュールであってはなりません。
Cascabel 2010年

1
この質問は純粋にgitサブモジュールに関するもののようです。この質問は直接Railsやgithubに関連していないため、いくつかのタグを削除しました。すべてのgitの使用例に当てはまります。また、trackingタグは「ウェブサイトの訪問者の追跡」トピックに使用されているようで、適用されません。
edgerunner

回答:


239

vendor/plugins/open_flash_chart_2「gitlink」エントリとして追加しましたが、サブモジュールとして定義していません。実質的には、gitサブモジュールが使用する内部機能(gitlinkエントリ)を使用していますが、サブモジュール機能自体は使用していません。

あなたはおそらくこのようなことをしました:

git clone git://github.com/korin/open_flash_chart_2_plugin.git vendor/plugins/open_flash_chart_2
git add vendor/plugins/open_flash_chart_2

この最後のコマンドが問題です。ディレクトリvendor/plugins/open_flash_chart_2は、独立したGitリポジトリとして始まります。通常、そのようなサブリポジトリは無視されますが、git addに明示的に追加するように指示すると、ディレクトリのコンテンツを追加する代わりに、サブリポジトリのHEADコミットを指すgitlinkエントリが作成されます。git addがそのような「セミサブモジュール」の作成を拒否するのは良いことかもしれません。

通常のディレクトリは、Gitではツリーオブジェクトとして表されます。ツリーオブジェクトは、名前と、それらに含まれるオブジェクト(通常、他のツリーオブジェクトとBLOBオブジェクト-それぞれディレクトリとファイル)へのアクセス許可を与えます。サブモジュールは「gitlink」エントリとして表されます。gitlinkエントリには、サブモジュールのHEADコミットのオブジェクト名(ハッシュ)のみが含まれます。gitlinkのコミットの「ソースリポジトリ」は、.gitmodulesファイル(および.git/configサブモジュールが初期化されるとファイル)で指定されます。

あなたが持っているのは、そのコミットのソースリポジトリを記録せずに、特定のコミットを指すエントリです。これを修正するには、gitlinkを適切なサブモジュールにするか、gitlinkを削除して「通常の」コンテンツ(プレーンファイルとディレクトリ)に置き換えます。

適切なサブモジュールに変える

vendor/plugins/open_flash_chart_2サブモジュールとして適切に定義するために欠けている唯一のビットは.gitmodulesファイルです。通常(まだそれを裸のgitlinkエントリとして追加していない場合)、次のように使用しますgit submodule add

git submodule add git://github.com/korin/open_flash_chart_2_plugin.git vendor/plugins/open_flash_chart_2

あなたが見つけたように、パスがすでにインデックスに存在する場合、これは機能しません。解決策は、インデックスからgitlinkエントリを一時的に削除してから、サブモジュールを追加することです。

git rm --cached vendor/plugins/open_flash_chart_2
git submodule add git://github.com/korin/open_flash_chart_2_plugin.git vendor/plugins/open_flash_chart_2

これにより、既存のサブリポジトリが使用され(つまり、ソースリポジトリのクローンが再作成されません)、.gitmodules次のようなファイルがステージングされます。

[submodule "vendor/plugins/open_flash_chart_2"]
    path = vendor/plugins/open_flash_chart_2
    url = git://github.com/korin/open_flash_chart_2_plugin.git vendor/plugins/open_flash_chart_2

また、メインリポジトリ.git/configpath設定なし)にも同様のエントリを作成します。

コミットすると、適切なサブモジュールが作成されます。リポジトリを複製する(またはGitHubにプッシュしてそこから複製する)と、を介してサブモジュールを再初期化できるはずgit submodule update --initです。

プレーンコンテンツに置き換えます

次のステップでは、のサブリポジトリに、vendor/plugins/open_flash_chart_2保持したいローカル履歴がないことを前提としています(つまり、気にするのは、履歴ではなく、サブリポジトリの現在の作業ツリーだけです)。

気になるサブリポジトリにローカル履歴がある場合、.git以下の2番目のコマンドで削除する前に、サブリポジトリのディレクトリをバックアップする必要があります。(サブリポジトリのHEADの履歴を保持する以下のgitサブツリーの例も検討してください)。

git rm --cached vendor/plugins/open_flash_chart_2
rm -rf vendor/plugins/open_flash_chart_2/.git # BACK THIS UP FIRST unless you are sure you have no local changes in it
git add vendor/plugins/open_flash_chart_2

今回はディレクトリを追加するとき、サブリポジトリではないため、ファイルは通常どおり追加されます。残念ながら、.gitディレクトリを削除したので、ソースリポジトリを最新の状態に保つ簡単な方法はありません。

代わりにサブツリーマージの使用を検討してください。そうすることで、リポジトリ内のファイルを「フラット」に維持しながら(サブモジュールなし)、ソースリポジトリから変更を簡単に取得できます。サードパーティのgit subtreeコマンドは、サブツリーマージ機能の優れたラッパーです。

git rm --cached vendor/plugins/open_flash_chart_2
git commit -m'converting to subtree; please stand by'
mv vendor/plugins/open_flash_chart_2 ../ofc2.local
git subtree add --prefix=vendor/plugins/open_flash_chart_2 ../ofc2.local HEAD
#rm -rf ../ofc2.local # if HEAD was the only tip with local history

後で:

git remote add ofc2 git://github.com/korin/open_flash_chart_2_plugin.git
git subtree pull --prefix=vendor/plugins/open_flash_chart_2 ofc2 master

git subtree push --prefix=vendor/plugins/open_flash_chart_2 git@github.com:me/my_ofc2_fork.git changes_for_pull_request

gitサブツリーには--squash、ソースリポジトリの履歴を履歴に組み込むことを避けながら、上流の変更を取り込めるオプションもあります。


クリス、試してみたところrm -rf vendor/plugins/open_flash_chart_2/.git、「rm」が認識されていません。それから私は試しgit rm -rf vendor/plugins/open_flash_chart_2/.gitてそれが言ったfatal: pathspec 'vendor/plugins/open_flash_chart_2/.git' did not match any files(しかし私はwindows explorerでそこに着くことができる!)。
sscirrus

2
チャットで問題について少し議論しました。OPはサブリポジトリの.gitディレクトリを削除し、ファイルを「フラット」に再追加できました(最初の「プレーンコンテンツ」オプション)。
Chris Johnsen、2010年

1
これは先日私のお尻をとても救った。誤って.gitディレクトリが含まれているものをgitリポジトリに追加した後、git kinda-sortaはそれがサブモジュールを持っていると思ったため、git svn dcommitsがフリークしていました。できれば3回賛成します。
davidtbernal

指摘したいのは、サードパーティのプラグインsubtreeをサブツリーのマージと混同しないことです。ラッパーではありません。著者はそう言っています:P
NebulaFox

@NebulaFoxは:一方でgitのサブツリーがないだけで(つまり、サブツリーのマージのラッパー、それは確かに標準の「サブツリーのマージ」の手順と同じテクニックを使用しgit readtree --prefix=path:及びサブツリーマージgit merge-s subtreeたり-Xsubtree=path)。また、「上」に素晴らしい追加機能があります。--squashモード、splitコマンド、pushおよびpullヘルパーです。
Chris Johnsen、2011

114

私は同じ問題を抱えていました。その理由は、「。git」フォルダを含むサブフォルダがあったためです。それを削除するとgitが幸せになりました。


はい、これはAndroidStudioで起こりました。git repoを1つ上のフォルダーに作成しようとしたときに、/ appフォルダーにgit repoが既に作成されていました。ありがとう。
ZirconCode、2015年

他の多くのフォルダーの下に角度付きのcli作成アプリがあり、その1つのフォルダーには.gitフォルダーがありました:
Pascal

これは私にとってはうまくいきます...私は何度もgit addを試しましたが、何も起こりませんでした。次に.gitフォルダを削除します
Ninja

1
しかし、サブフォルダを追跡したい場合はどうなりますか?私は何をすべきか ?
cyber8200 2017年

同じケースがあります。残念ながら、.gitフォルダーも含まれていたサブフォルダーを追跡します。このsufolder .gitフォルダーを削除すると、メインの.gitフォルダーで追跡されなくなります...。:(
sqp_125

14
  1. これらの新しいディレクトリから.gitディレクトリを削除しました(これによりサブモジュールドラマが作成される可能性があります。興味があればGoogleでそれを作成してください)。
  2. 次にgit rm -rf --cached / the / new / directoriesを実行しました
  3. 次に、git addを使用してディレクトリを再度追加しました。上から

参照URL https://danielmiessler.com/blog/git-modified-untracked/#gs.W0C7X6U


6

クリス・ヨハンセンのOPとのチャット(返信から回答へのリンク)から何を掘り出さなければならなかったかを指摘するには:

git add vendor/plugins/open_flash_chart_2 #gitlinkを追加し、コンテンツは追跡されません

git add vendor/plugins/open_flash_chart_2/ #スラッシュに注意!!!!

2番目のフォームはgitlinkなしで追加し、コンテンツは追跡可能です。.git dirは便利で自動的に無視されます。クリス、ありがとう!


5

私は常に「偽のサブモジュール」と呼ばれる、ピーター・ラダの提案するトリックを使用しています。

http://debuggable.com/posts/git-fake-submodules:4b563ee4-f3cc-4061-967e-0e48cbdd56cb

いくつかのシナリオで非常に便利です(elpa / el-getパッケージディレクトリ内のすべてのgitリポジトリの現在のHEADを含む、すべてのEmacs構成をリポジトリに保持するために使用するため、既知のロールバック/転送に簡単にロールバックできますいくつかの更新が何かを壊したときの作業バージョン)。



3

多くのサブモジュールを持つ大きなプロジェクトでも同じ問題がありました。回答に基づいてクリス・ジョンセン ここVonC ここで私は、既存のすべてのgitlinkのエントリを反復処理し、適切なサブモジュールとして追加されます短いbashスクリプトを構築します。

#!/bin/bash

# Read all submodules in current git
MODULES=`git ls-files --stage | grep 160000`

# Iterate through every submodule path
while read -r MOD; do
  # extract submodule path (split line at whitespace and take string with index 3)
  ARRIN=(${MOD})
  MODPATH=${ARRIN[3]}

  # grep module url from .git file in submodule path
  MODURL=`grep "url = " $MODPATH/.git/config`
  MODURL=${MODURL##*=}

  # echo path and url for information
  echo $MODPATH
  echo $MODURL

  # remove existing entry in submodule index
  git rm --cached $MODPATH
  # add new entry in submodule index
  git submodule add $MODURL $MODPATH
done <<< "$MODULES"

これで問題が解決しました。お役に立てば幸いです。


2

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

git update-index --skip-worktree

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

バイバイ!


1

同じ問題がありましたが、このディスカッションでは解決されませんでした。

スレッドの冒頭で説明したように、サブモジュールの問題も発生しました。

% git status          
# On branch master
# Changes not staged for commit:
#   modified:   bundle/taglist (untracked content)

相違点を見ると、ハッシュに-dirtyが付加されていることがわかりました。ドキュメントをもう一度読んで、問題を解決しました。 http://web.mit.edu/jhawk/mnt/spo/git/git-doc/user-manual.html セクション「サブモジュールの落とし穴」を見てください

理由は、サブモジュール内に変更または追跡されていないコンテンツがあったためです。最初にサブモジュールディレクトリに移動し、「git add」+「git commit」を実行して、すべてのコンテンツをサブモジュール内で追跡する必要がありました。

Then "git status" on the master stated
% git commit
# On branch master
# Changes not staged for commit:
#   modified:   bundle/taglist (new commits)

これで、サブモジュールからのこの新しいHEADをマスターモジュールにコミットできます。


1

私は最近、契約プロジェクト(機密扱い)に取り組んでいるときにこの問題に遭遇しました。私がコードを実行しなければならないシステムには、もちろんセキュリティ上の理由からインターネットにアクセスできなかったため、composerとnpmを使用して依存関係をインストールすることは非常に困難になりました。

私は同僚と多くの議論を重ねた後、composer installまたはnpm installを実行するのではなく、依存関係をコピーして貼り付けることを決定しました。

これにより、gitignoreにベンダーとnpm_modulesを追加しなくなりました。これは私がこの問題に遭遇したときです。

Changed but not updated:
modified:   vendor/plugins/open_flash_chart_2 (modified content, untracked content)

私はこれを少しグーグルで調べて、SOでこの役立つスレッドを見つけました。Gitのプロになりすぎず、Gitの開発に夢中になっているので、vendorsフォルダー内のすべてのサブモジュールを検索しました

find . -name ".git"

これにより、Gitが存在する4-5の依存関係が得られました。これらすべての.gitフォルダーと出来上がりを削除しました。私はそれがハックであり、とにかくマニアックなものではないことを知っています。SOの神よ、私を許してください!次回はgitlinksを読んで、Oの強力なLinus Tovaldsに従うことを約束します。


1

この質問はすでに回答されていますが、これらのメッセージを受け取ったときにわかったことをミックスに追加したいと思いました。

playgroundいくつかのサンドボックスアプリが含まれているというレポがあります。playgroundチュートリアルのリポジトリを複製して、チュートリアルからディレクトリに2つの新しいアプリを追加しました。その結果、新しいアプリのgitは、私のリポジトリではなくチュートリアルのリポジトリを指しています。解決策は.git、これらのアプリの各ディレクトリからディレクトリを削除し、mvディレクトリの外にあるアプリのディレクトリを削除してからplaygroundmvそれらを元に戻して実行することgit add .でした。その後それは働いた。


0

最初にディレクトリに移動しますvendor / plugins / open_flash_chart_2DELETE


その後:

git rm --cached vendor/plugins/open_flash_chart_2  
git add .  
git commit -m "Message"  
git push -u origin master  

git status  

出力

ブランチマスター上
ブランチは 'origin / master'で最新です。
コミットするものは何もない、作業ディレクトリはクリーン

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