5

Windows 7 マシンで git を使用して、Server 2008 マシンの共有フォルダーにプッシュしています。これは過去6か月間完全に機能しています。しかし、昨日の時点で、リモートリポジトリにプッシュできなくなりました。試すたびに、次の結果が得られます。

$ git push
Counting objects: 39, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (23/23), done.
Writing objects: 100% (23/23), 8.42 KiB, done.
Total 23 (delta 15), reused 0 (delta 0)
Unpacking objects: 100% (23/23), done.
error: Couldn't set refs/heads/my-branch
To //my-server/Code/my-project.git
 ! [remote rejected] my-branch -> my-branch (failed to write)
error: failed to push some refs to '//my-server/Code/my-project.git

「いくつかの参照をプッシュできませんでした」というエラーをグーグルで検索すると、最初にプルしなかったこと (私は完全に最新の状態です)、および適切な権限を持っていないこと (すべてに完全にアクセスでき、ファイルを作成/削除/編集できます) に関するさまざまな結果が得られます。エクスプローラーを介してリモートリポジトリで)。

その後、このブログ投稿http://henke.ws/post.cfm/error-failed-to-push-some-refsに出くわし、リモート リポジトリでいくつかのクリーンアップ コマンドを実行する必要があるかもしれないと述べています。そこで、リモート リポジトリで git gc を実行しました。

$ git gc
Counting objects: 3960, done.
Compressing objects: 100% (948/948), done.
Writing objects: 100% (3960/3960), done.
Total 3960 (delta 2971), reused 3942 (delta 2964)

そして、見よ、私は再び押すことができます!

$ git push
Counting objects: 39, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (23/23), done.
Writing objects: 100% (23/23), 8.42 KiB, done.
Total 23 (delta 15), reused 0 (delta 0)
Unpacking objects: 100% (23/23), done.
To //my-server/Code/my-project.git
   8153afd..1385d28  my-branch -> my-branch

ただし、問題は、プッシュを実行するたびに、リモート リポジトリで gc を実行する必要があることです。そうしないと、「参照のプッシュに失敗しました」というエラーが再び表示されます。

では、なぜ私のレポはそんなに壊れたのでしょうか? 問題を完全に修正するにはどうすればよいですか?

4

1 に答える 1

4

sshまたはgitプロトコルを使用するのではなく、Windowsネットワーク共有をプッシュしているようです。これは、ローカルコンピューターがファイルをネットワーク共有に書き込む必要があることを意味するため、そのサーバーに関連するロックされたファイルやアクセス許可の問題によって妨害される可能性があります。

ブランチをプッシュする場合、オブジェクトを書き込んだ後、gitはファイル.git / refs / heads/my-branchに書き込むことでブランチの参照を更新します。現在、ファイルはクライアントから書き込み可能ではないようです。

gcを実行すると、refはrefs dir内の緩いファイルから収集され、テキストファイル.git / packed-refsに入れられ、個々のrefファイルが削除されます。

私の理論では、refがサーバー上に緩いファイルとして存在する場合、既存のファイルを上書きする権限がなく、新しいファイルを作成する権限があるため、プッシュが失敗します。refをgcでパックした後、refファイルは存在しなくなるため、もう一度プッシュすることができます。

私が提案する修正は次のとおりです。

  1. クライアントからの既存のファイルを上書きできるかどうかを確認し、上書きできない場合は、アクセス許可またはファイルロックの問題を修正します
  2. gitプロトコルの使用に切り替えると、このブログはWindowsのオプションの概要のようですhttp://freshbrewedcode.com/derekgreer/2012/02/19/hosting-a-git-repository-in-windows/

最後の手段として、gcオプションに固執していることに気付いた場合は、代わりに「gitpack-refs-all」を実行してみてください。毎回gcで問題を修正するよりも速くなります。

于 2012-09-20T23:57:39.000 に答える