2

最初にリポジトリのクローンを作成してから「git commit」してgitを開始しましたが、「git push」を実行するとこのエラーが発生します:しかし、「チェックアウトブランチの更新を拒否しています」と表示されましたか?

$ git push
Counting objects: 17, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (13/13), done.
Writing objects: 100% (13/13), 2.72 KiB, done.
Total 13 (delta 5), 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://michael@16.336.22.38/home/michae/scripts
 ! [remote rejected] master -> master (branch is currently checked out)

これは何を意味するのでしょうか?

git push で「拒否」に対処する方法を検索して読み ましたか?

同じエラーが発生する「git push origin HEAD」も試してみます。

4

3 に答える 3

4

Git リポジトリには、ベアと非ベアの 2 種類があります。ベア リポジトリには、コミット、ブランチ、タグなどが含まれているだけです。裸でないリポジトリには、現在の作業コピーも含まれています。リポジトリを見ると、それがむき出しであるかどうかがわかります。プロジェクト内のファイルを含むディレクトリとディレクトリがある場合.git、それは非裸のリポジトリです。ディレクトリの外にあるこれらのファイル.gitは、現在の作業コピーです。、 などのリポジトリのコンテンツだけがある場合refsobjectsそれはベア リポジトリです。作業コピーはありません。

ベア リポジトリにのみプッシュできます (デフォルト設定をオーバーライドしない限り)。非ベア リポジトリからプルし、非ベア リポジトリにプルすることはできますが、非ベア リポジトリにプッシュすることはできません。これは、作業コピーを更新する際の問題を防ぐためです。作業コピーは現在の状態のコピーです。ファイルなどを編集した可能性があります。リポジトリにプルすると、最新の変更が作業コピーにチェックアウトされます。チェックインされていないローカルの変更がある場合、プル元のリポジトリからの変更とマージされるか、チェックアウトが拒否され、それらの新しいものをチェックアウトできるようにローカル コピーを修正する必要があります。変化します。

プッシュ先のリポジトリでは、競合が発生した場合、すぐに変更を加えることができません。作業ツリーは代わりに時代遅れになります。リポジトリにあるものと作業ツリーにあるものは同期しなくなります。これを防ぐために、Git は非ベア リポジトリへのプッシュを拒否します。

ベア リポジトリを「中央」リポジトリとして使用することをお勧めします。これは、プッシュしてプルするためのものであり、作業ツリーには非ベア リポジトリを使用します。実際に仕事をする場所。クローン元のリポジトリが既にあるように見えるため、そこからベア リポジトリを作成しorigin、非ベア リポジトリではなくベア リポジトリを指すように更新する必要があります。ベア リポジトリを作成できますgit clone --bare path/to/original/repo path/to/bare/repo.git(ベア リポジトリに名前を付けるのが通例name.gitです)。これが同じマシン上の複数のユーザー間で共有される場合は、--sharedパーミッションを正しく設定するためにもパスする必要があります。次に、作業コピーでgit remote set-url origin path/to/bare/repo.git、およびgit remote set-url --push origin path/to/bare/repo.git( user@host:/path/to/bare/repo.gitSSH 経由でアクセスする場合) を実行します。

于 2012-11-23T21:32:01.397 に答える
2

ターゲット上のリポジトリは「ベア」ではありません。つまり、.git データベースだけでなく、ファイルがチェックアウトされています。

規約では、プッシュのターゲットとして裸の「リポジトリ」を使用します。

エラー メッセージは、知っておく必要があるすべてを示しています。これを許可するようにリモート リポジトリの構成を変更するか、そのままにすることができます。

于 2012-11-23T21:18:55.987 に答える
1

おそらく、リモートを作業コピーなしで裸のレポに変換する必要があります。

ssh user@remote
cd /path/containing/repo
git clone --bare repo/ repo.git

次に、作業リポジトリで .git/config を編集して、リモートの URL を更新します。.gitその末尾にa を追加します。

[remote "origin"]
    fetch = +refs/heads/*:refs/remotes/origin/*
    url = user@remote:/path/to/repo.git

次に実行します

git push origin HEAD

現在のブランチをプッシュします。

于 2012-11-23T21:25:00.777 に答える