1

メイン プロジェクトに正常に複製された Git サブモジュールがあります。ただし、サブモジュールに変更を加えて元のサブモジュール リポジトリにプッシュしようとすると、Git はそれを拒否します。なぜ、どうすればこれを修正できますか?

例: プロジェクト サブとプロジェクト スーパーが 2 つの別々のフォルダーにあります。sub を super の下のサブモジュールとして含めました。フォルダー super/sub に変更を加えてから、これらの変更を元のプロジェクト サブにプッシュしようとします。Git は文句を言います。

編集:エラー メッセージに関して、私は Windows で Git Bash を使用していますが、残念ながら端末からコピーされた正確なエラー メッセージを取得できません。最も適切な行は次のとおりです。

リモート: エラー: チェックアウトされたブランチの更新を拒否しています: refs/heads/master. デフォルトでは、裸でないリポジトリで現在のブランチを更新することは拒否されています。これは、インデックスと作業ツリーがプッシュしたものと矛盾し、作業ツリーを HEAD に一致させるために「git reset --hard」が必要になるためです。

注: どちらのリポジトリも私のハード ドライブにあります。

4

1 に答える 1

4

これは、レポがサブモジュールであることとは関係ありません。

作業コピー (非ベア リポジトリ) を使用して git リポジトリにプッシュし、現在チェックアウトされている同じブランチにプッシュしようとしています - デフォルトでは、git はそれを許可しません。

続行する前に、本当にそれをやりたいかどうかを自問する必要があります。これは、同僚のレポを直接複製してから、そこにプッシュしようとしているとしましょう。成功した場合、コミットされていない変更がある場合、または更新時に追跡されたファイルで上書きされるローカル ファイルがある場合、同僚の作業が失われる可能性があります。

簡単な解決策

最も簡単な解決策は、まったくプッシュせず、代わりに他のレポからプルすることです。最終結果は同じですが、更新をプルしているため (これは単純に正常です)、git はそれについて何も言いません。

少し簡単ではない解決策

受信レポの git config を変更して (残りのエラー メッセージを読んで) プッシュできるようにすれば、他の作業コピーにプッシュできます。これを行うには、受信レポで次のようにします。

git config receive.denyCurrentBranch ignore

詳細については、ヘルプ ( git config --help)を参照してください。

receive.denyCurrentBranch
    If set to true or "refuse", git-receive-pack will deny a ref update to the
    currently checked out branch of a non-bare repository. Such a push is potentially
    dangerous because it brings the HEAD out of sync with the index and working tree.
    If set to "warn", print a warning of such a push to stderr, but allow the push to
    proceed. If set to false or "ignore", allow such pushes with no message. Defaults
    to "refuse".
于 2012-05-24T20:54:01.820 に答える