2

質問:ワークツリーがむき出しになっていない場合、ローカルコミットを開発サーバーにプッシュするにはどうすればよいですか?

私の状況:

  1. 開発サーバーにgitを設定して、ローカルの変更をプッシュすると、それらが切り離された作業ツリーに追加されるようにしました(ここで説明し、この投稿のように)。
  2. git status次に、gitが作業ツリーを見つけられなかったため、開発サーバーでgitを実行する際に問題が発生しました(例:)。
  3. 私はSOについて尋ね、設定ファイルに設定してワークツリーを指定する必要があるというヒントを得ました。bare = false甘い。

しかし、コミットを開発サーバーにプッシュしようとすると、次のエラーが発生します。

$ git push origin master
xxxx@xxx.xxx.xxx.xxx's password:
Counting objects: 26, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (18/18), done.
Writing objects: 100% (18/18), 2.56 KiB, done.
Total 18 (delta 8), 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
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'.

To ssh://xxxx@xxx.xxx.xxx.xxx/xxx/xxx/xxxxxx.git
 ! [remote rejected] master -> master (branch is currently checked out)
error: failed to push some refs to 'ssh://xxxx@xxx.xxx.xxx.xxx/xxx/xxx/xxxxxx.git'

この他のユーザーにも同じ問題があったようです。残念ながら、彼のために働いた解決策は彼の設定bare = trueで設定することでした。それは私が上記のステップ3で抱えていた問題を再現するでしょう。

エラーメッセージには

'receive.denyCurrentBranch'構成変数をリモートに設定できます:エラー:'無視'または'警告'

私の場合、これをしても大丈夫ですか?それは私には良いことのように聞こえますが、私はまだgitに精通していないので、悪い考えが出てきたときにそれを認識できません...

編集

明確にするために、私はすでにポストレシーブフックを追加しました、そしてそれはスムーズに働いています。問題は、bare=true(開発サーバーにプッシュできる)とbare=false(開発サーバーでgitコマンドを実行できる)のどちらかを選択する必要があるように見えることです。

4

4 に答える 4

3

なぜだめですか:

  • コミットを裸のレポにプッシュする
  • その開発レポに post-receive フックを設定してから、非ベア開発レポに移動し、適切なブランチをチェックアウトして、ベアレポから新しいコミットをプルしますか?

それはあなたのリンクが(分離された作業ツリーで)説明しているものですが、フックを裸のレポに設定します:

$ mkdir /var/www/www.example.org
$ cat > hooks/post-receive
#!/bin/sh
GIT_WORK_TREE=/var/www/www.example.org git checkout -f
$ chmod +x hooks/post-receive
于 2012-06-05T18:54:58.030 に答える
0

私は許容できる解決策を考え出しましたが、理想的ではありません。基本的に、開発の変更をライブサーバーにプッシュする必要があるときに、構成ファイルを編集することで問題を回避しています。

開発者がローカルの変更を dev にプッシュできるようにする構成ファイル:

[core]
        repositoryformatversion = 0
        filemode = true
        bare = true

dev の変更をライブにプッシュするときの構成ファイル:

[core]
        repositoryformatversion = 0
        filemode = true
        bare = false
        worktree = /var/www/example.com/httpd/

長所

  1. 作品
  2. 構成ファイルを変更してライブにプッシュすると、レポは「ロック」され、他の開発者は変更をプッシュできなくなります
  3. とにかくデータベースの移行を処理するためにdevにログインする必要があるため、大きな問題ではありません

短所:基本的には、正しく行う方法を知っていれば、自動化できると確信している作業です。

注: 受信後フックを設定して、条件付きでライブ サーバーにもプッシュするという @vonC の提案が気に入っています。受信後のフックに変更を加えるのは簡単ですが、フックが応答するトリガーが何であるかがわかりません。私は提案を聞きたいです:)

于 2012-07-13T14:26:35.590 に答える
0

自分がやろうとしていることだけに注意する必要があります。

git status作業ツリーのステータスを伝えるために使用されます。これはあなたの場合には役に立たないはずです。

一方、hadgit pushはベア リポジトリで完全に有効です。これでうまくいくはずです。

変更を確認したい場合は、git diff を使用できます。両方のハッシュを指定するだけですgit diff $oldref $newref

特定のコミットで変更されたファイルを一覧表示する場合は、 を使用しますgit show --pretty="format:" --name-only $newref

ファイルの内容を一覧表示する場合は、git show $newref -- $filepath

于 2012-06-25T17:31:47.330 に答える
0

リポジトリを操作することは、あなたがやりたいことではありません。Web サーバーのディレクトリに対して git checkout-index を実行する、開発サーバーのベア リポジトリに post-receive フックが必要です。そうすれば、それは単なるファイルです。ベア リポジトリか、作業ツリーがあるか、その他の git 関連のものかどうかを気にする必要はありません。

のようなものgit checkout-index -f -a --prefix=/var/www/htdocs/mywebsite/(末尾のスラッシュに注意してください-重要です)

-f フラグは既存のファイルを強制的に上書きし、-a フラグはすべてのファイルを含めます。

于 2012-06-05T19:10:21.700 に答える