6

重複の可能性:
git push エラー '[リモート拒否] マスター -> マスター (ブランチは現在チェックアウトされています)'

リポジトリを「オリジン」にプッシュしようとしていますが、「git push」を実行するとこのエラーが発生します

Counting objects: 5, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (4/4), 485 bytes, done.
Total 4 (delta 0), reused 0 (delta 0)
remote: error: refusing to update checked out branch: refs/heads/master
remote: error: By default, updating the current branch in a non-bare repository
remote: error: is denied, because it will make the index and work tree inconsistent
remote: error: with what you pushed, and will require 'git reset --hard' to match
remote: error: the work tree to HEAD.
remote: error: 
remote: error: You can set 'receive.denyCurrentBranch' configuration variable to
remote: error: 'ignore' or 'warn' in the remote repository to allow pushing into
remote: error: its current branch; however, this is not recommended unless you
remote: error: arranged to update its work tree to match what you pushed in some
Auto packing the repository for optimum performance.
remote: error: other way.
remote: error: 
remote: error: To squelch this message and still keep the default behaviour, set
remote: error: 'receive.denyCurrentBranch' configuration variable to 'refuse'.
/usr/local/git/libexec/git-core/git-sh-setup: Zeile 235: uname: Kommando nicht gefunden.
warning: There are too many unreachable loose objects; run 'git prune' to remove them.
To ssh://XXXX@XXXXXX.typo3server.info/html/typo3
 ! [remote rejected] master -> master (branch is currently checked out)
error: failed to push some refs to 'ssh://XXXXXXX@XXXXXX.typo3server.info/html/typo3'

なにが問題ですか?

4

1 に答える 1

18

裸でないレポ (つまり、ローカル クローンと同じように作業ツリーを持つレポ) にプッシュしようとしていますが、これを特別に説明するために相手側で何も行われていません。

git pushサイトを展開させようとしているようです。その方法は次のとおりです。

  1. サーバーのリポジトリでこれを実行して、git が表示するエラー メッセージを無視します。

    git config receive.denyCurrentBranch ignore
    

    これは git に「私が解決します、私を信じてください」と伝えます。

    プッシュすると、リポジトリが更新されますが、インデックスと作業コピーはそのまま残ります。これは、プッシュしたすべてのものを元に戻すために変更をステージングしたように常に見えることを意味します。

    プッシュが発生するたびにインデックスと作業コピーを更新する方法が必要です。…</p>

  2. post-receiveフックを設定します。サーバーのリポジトリ.git/hooks/post-receiveにファイルを追加します。

    #!/bin/bash
    
    # Drop the env var given to post-receive by default, as it'll mess up our
    # attempts to use git "normally."
    export -n GIT_DIR
    
    # Move back to the base of the working tree.
    cd ..
    
    # *Drop all changes* to index and working tree.
    git reset --hard
    

    これは、追跡された変更のみを公開することを前提としていることに注意してください。<strong>ライブ サイトで直接変更したものは、次にプッシュすると消えます (追跡されていないファイルを除きますが、それらも必要ありません)。

最後に を追加してgit status、プッシュ後に (クライアントに送り返されるときに) 土地の状況を確認できるようにします。これは特に、追跡されていないファイルをキャッチして、それらを.gitignoreに追加するか追跡できるようにするためです。

実行可能としてマークすることを忘れないでくださいpost-receive!


余談ですが、追跡されていないファイルを持ってはいけないのはなぜですか?

  1. ロールバック機能: これは、ライブ サイトをデプロイするためのものです。失敗した展開を実際にロールバックできるようにしたい場合は、その展開を行うために一緒になったすべてが必要です。

    これには、コア CMS が含まれることは間違いありません。現在、それはサーバー上にのみあり、追跡されていないため、エラーを検出する見込みはありません.

  2. 再デプロイする機能: サーバーのハードドライブがダウンした場合、コア CMS を解凍し、その上に git リポジトリを重ねて、それが機能することを願っています。

  3. 誤って追跡されていないものに気付く機能: 数十個の追跡されていないファイルがあり、それらがすべて追跡されないように「意図されている」場合、新しいファイルが忍び込み、ノイズの中で迷子になるのは簡単です.

    デフォルトでクリーンなgit status場合、予期しない追跡されていないファイルがポップアップするとすぐに気付くでしょう。

于 2012-07-09T13:23:01.570 に答える