8

共有ベアリポジトリ(ssh経由)にプッシュすると、post-commitが正しく機能しません。
ここの多くのスレッドで見つけたので、これはかなり一般的であり、同じサーバー上の他の2つのリポジトリーでも正常に機能するため、非常識になります。

#!/bin/sh
GIT_WORK_TREE=/ab/cd/staging git checkout -f

リポジトリ自体は、フックがチェックアウトするディレクトリと同じディレクトリにあります

/ab/cd/barerepo

プッシュすると、目的のパスにファイルがチェックアウトされませんが、次のエラーメッセージが表示されます。

Writing objects: 100% (3/3), 299 bytes, done.
Total 3 (delta 2), reused 0 (delta 0)
fatal: Could not jump back into original cwd
error: hooks/post-receive exited with error code 128

これが何を意味するのかについての情報は見つかりませんでした。(Googleは、私が知る限り、git自体への貢献からのみコミットを表示します)。だから私は読んで推測して試しました…</p>

  • さらに、受信後フックにGIT_DIRを設定します
  • --git-dir = / ab / cd/barerepoでベアリポジトリを再初期化--working-dir=/ ab / cd / staging
  • barerepo/configで作業ディレクトリを手動で設定する
  • ベアリポジトリを空白に設定してコミットする
  • クローン作成によるベアリポジトリの設定

現在、構成は次のようになっています

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

しかし、私もこれを持っていました(努力なしで)

[core]
    repositoryformatversion = 0
    filemode = true
    bare = true
    sharedrepository = 1
    worktree = /ab/cd/staging
    logallrefupdates = true
[receive]
    denyNonFastforwards = true

また、受信後のフックに2行目を追加しました

echo "post-receive done" > updated.txt

ベアリポジトリのディレクトリにファイルを書き込みます。GIT_DIRは「。」に設定されているように見えるので、これは私には理にかなっています。これは、別のSO質問から取得した受信後の切り取りによって確認されます。

echo Running $BASH_SOURCE
set | egrep GIT
echo PWD is $PWD

結果:

Running hooks/post-receive
GIT_DIR=.
PWD is /ab/cd/barerepo

では、どうすればgitを元のcwd(現在の作業ディレクトリ)に戻すことができますか?参考までに:私はまだgitに慣れておらず、明らかな何かが欠けていると愚かな感じがしますが、この特定のエラーメッセージについて本質的なものが見つからないので不思議に思います。ところで、プッシュ自体は正常に機能します。

4

3 に答える 3

18

また、同じサーバーでホストされている10のうち1つのサイトでこの問題が発生しました。

各サイトには、開発者がプッシュするWebサーバー(Webに公開されていない)にベアリポジトリがあります。あなたと同じように、git post-receiveフックを使用しGIT_WORK_TREE=/whatever/livesite git checkout -fて、実際のWebサーバールートを含むディレクトリに移動します。

で失敗したものの何が違うのかを調べてみるとfatal: Could not jump back into original cwd、すべての作業ケースで、リポジトリ名は次のようになっていることがわかりました。

/var/www/coolsite.com.git   <-- bare repo
/var/www/coolsite.com.live  <-- checked out from hook; contains site root in public subdir

エラーが発生したのは次のようなものでした。

/var/www/brokensite.com.git  <-- bare repo
/var/www/brokensite.com      <-- checked out from hook; contains site root in public subdir

したがって、ライブチェックアウトされたコピーにそのような名前を付けると、gitはこのエラーをスローします。ライブサイトの作業コピーリポジトリの名前を「.wtf」で終わるように変更すると、問題が修正されました(最終的には他の人と同じように「.live」を使用しました)。

私の場合、Gitのサーバーバージョンは1.6.1ですが、開発マシンはすべて1.7.5.4です。

したがって、ベアレポとライブレポの名前が影響を与えているようです。これがgitのバグなのか、それとも「foo」と「foo.git」の魔法の同等性の副作用なのかはわかりません。

于 2011-12-15T01:12:00.993 に答える
7

私の経験から、あなたの問題は、同じディレクトリab / cdに.gitリポジトリと作業ツリーディレクトリ(post-receiveフックがチェックアウトしている)があることにあります。

私もGITを初めて使用しますが、この投稿は私を大いに助けてくれました。ありがとうございます。すでに試したすべての修正を削除した後、.gitリポジトリを読み取り、作業ツリーディレクトリを同じディレクトリに配置できないという投稿をどこかで見つけました(今は見つかりません)。

理由はわかりません。

たとえば、/ var/wwwに/staging/ディレクトリがあります。これは、裸の.gitリポジトリを/ var/wwwではなく/var/ GIT(または何か)に配置する必要があることを意味します。

私が抱えていたもう1つの問題はアクセス許可でした。そのため、プッシュしているリモートユーザーが両方のディレクトリに対して読み取り/書き込みのアクセス許可を持っていることを確認するために、両方のディレクトリをchownおよびchmodしました。

とにかく、私はこれをしました、そして私はあなたがいたところからこれに行きました:

Counting objects: 3357, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (2848/2848), done.
Writing objects: 100% (3057/3057), 15.20 MiB | 4.70 MiB/s, done.
Total 3057 (delta 1536), reused 0 (delta 0)
Checking out files: 100% (3720/3720), done.
To ssh://xxxxxx@xxxxxxxxxxxxxxx/var/GIT/project.git
   945fe94..dbe1f0b  master -> master

それとコードでいっぱいのディレクトリをチェックアウトする素晴らしい脂肪:)

于 2011-08-03T14:25:02.480 に答える
2

サーバーがgitv1.7.5.4に更新された後、問題はなくなりました。v1.5x(サーバー)から1.7x(ローカル)への不一致が大きすぎたようです。

于 2011-08-22T21:01:46.630 に答える