web-dev-qa-db-ja.com

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

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

ローカルディレクトリに追跡されていないフォルダがあります。 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の完全な初心者であり、ドキュメントを調べようとしても、これらの特定の問題に少し困惑しています。ありがとうございました。

153
sscirrus

vendor/plugins/open_flash_chart_2を「gitlink」エントリとして追加しましたが、サブモジュールとして定義したことはありません。 git submoduleが使用する(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のサブリポジトリに保存したいローカル履歴がないことを前提としています(つまり、関心があるのは履歴ではなく、サブリポジトリの現在の作業ツリーのみです)。

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

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ディレクトリを削除したため、ソースリポジトリを最新の状態に保つための非常に簡単な方法はありません。

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

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 [email protected]:me/my_ofc2_fork.git changes_for_pull_request

git subtreeには--squashオプションもあり、これを使用すると、ソースリポジトリの履歴を履歴に組み込むことなく、上流の変更を取り込むことができます。

234
Chris Johnsen

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

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

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

11
user2041369

私がクリス・ヨハンセンのOPとのチャット(回答から回答へのリンク)を掘り下げなければならなかったことを指摘するには:

git add vendor/plugins/open_flash_chart_2#はgitlinkを追加し、コンテンツは追跡されないままになります

git add vendor/plugins/open_flash_chart_2/#SLASHに注意してください!!!!

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

6
Peter Lada

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

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

いくつかのシナリオで非常に便利です(peを使用して、elpa/el-getパッケージディレクトリ内のすべてのgitリポジトリの現在のHEADを含む、すべてのEmacs設定をリポジトリに保持します。何らかの更新が何かを中断した場合、既知の動作バージョンに戻る/進む)。

5
Eloici

http://progit.org/book/ch6-6.html

これを読んでサブモジュールについて少し学ぶ必要があると思います。よく書かれており、読むのにそれほど時間はかかりません。

3
rmk

多くのサブモジュールがある大きなプロジェクトでも同じ問題がありました。 Chris Johnsenhere および VonChere の回答に基づいて、既存のすべてを反復する短いbashスクリプトを作成しますgitlinkエントリを適切なサブモジュールとして追加します。

#!/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"

これは私のためにそれを修正しました、私はそれが助けになることを願っています。

3
nicolas

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

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

1
Dana Scheider

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

git update-index --skip-worktree

パス名が機能しない場合は、ファイル名を試してください。これがあなたにとってもうまくいったかどうか教えてください。

さようなら!

1
DarkCrazy

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

同僚とよく検討した結果、composer installまたはnpm installを実行するのではなく、単にwingし、依存関係をコピーペーストすることにしました。

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

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

私はこれを少しグーグルで検索し、SOでこの役立つスレッドを見つけました。 Gitでプロになりすぎず、作業中に少し酔ってしまったため、ベンダーフォルダー内のすべてのサブモジュールを検索しました。

find . -name ".git"

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

1
SLearner

同じ問題がありましたが、この議論では解決されませんでした。

スレッドの開始で説明したように、サブモジュールの問題もヒットしました。

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

Diffを見ると、ハッシュに-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
nero

まずDirectoryに移動します:vendor/plugins/open_flash_chart_2およびDELETE


THEN:

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

git status  

出力

ブランチマスター上
ブランチは「Origin/master」で最新です。
何もコミットせず、作業ディレクトリをクリーンにします

0
Program-Me-Rev