3

私は SVN から来ましたが、Git 全体がどのように機能するかを理解していません。リモート リポジトリを作成し、ローカル マシンでリポジトリのクローンを作成しました。ローカル マシンでファイルに変更を加え、それらのファイルをクローン元の正確なリモート リポジトリにプッシュしようとすると、このようなエラーが発生します。

リモート: エラー: チェックアウトされたブランチの更新を拒否しています: refs/heads/master

同じ問題に関するいくつかのSOの質問を閲覧しましたが、最も一般的な解決策は、ベアリポジトリを作成してからコミットすることでした. では、その新しいレポからクローンを作成するとどうなりますか?これは再び起こりますか? ローカルからのコミットごとに新しい裸のリポジトリを作成し続ける必要がありますか? 私は混乱しています。誰かが私を正しい方向に向けることができれば、それは素晴らしいことです. 私はこれを完全に間違っていると思います。

私が従っている正確な手順:1)リモートサーバーにディレクトリを作成しました-gitリポジトリとしてinit 2)必要なすべてのコンテンツをサーバーにコピーしました3)コンテンツをgitに追加し、そこにコミットしました4)gitリポジトリをリモートから自分にクローンしましたローカル マシン 5) ローカルのファイルに変更を加え、その変更をローカルに追加してコミットしました。6) git push origin を使用して、ローカルで行った変更をリモートにプッシュしようとすると、エラー メッセージが表示されます。以下にエラーメッセージ全体を提供します。

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: Auto packing the repository for optimum performance.

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'.
 ! [remote rejected] master -> master (branch is currently checked out)
4

2 に答える 2

2

共有/リモート リポジトリはベア フォーマットを使用します。つまり、作業コピーがありません。Subversion も同じです。中央リポジトリには作業コピーがありません。作業コピーは、Subversion ではチェックアウトによって作成され、git ではクローンによって作成されます。

リモート リポジトリをベア フォーマットに変更すると、問題は発生しなくなります。

ワークフローは Subversion と大きく異なるわけではなく、追加の手順 (使用するコマンドによっては 2 つ) だけです。

Make changes
git add (to add the changes to the staging area)
git commit (to save the changes to the local repo)
git push (to push the changes to the remote repo)

リモートリポジトリから他の人から変更をプルしたい場合は、「svn update」と同様に機能する「git pull」を実行します。

于 2012-07-11T14:08:42.723 に答える
2

非ベア リポジトリは、更新が必要なファイルのコピーがチェックアウトされていることを意味するため、一般にプッシュする必要があるのはベア リポジトリだけです。管理する 2 つのリポジトリがあり、両方にデータのコピーをチェックアウトする必要がある場合はgit pull、両方の場所からを使用して反対側の場所からプルします。一方ではクローンを作成できますが、他方ではgit remote addプルするリモートを作成するために使用する必要があります。

チェックアウトされたコピーの実行中の何かの概念を台無しにしていないことがわかっているため、裸のレポを使用すると、そこにプッシュできます。

「gittutorial」のマニュアル ページを読んでいない場合は、学習を開始するのに最適な場所であるため、そこから始めます。

適切に動作するモデルについては、多くの場合、1 台の (サーバー) マシンに裸のレポがあり、そのレポのクローンがサーバー自体を含む他の複数のマシンにあることがよくあります。したがって、サーバー上のレポで作業している場合、ベアレポから作業するのではなく (明らかに)、クローンを作成して別の場所で作業し、そこにプッシュします。これにより、各クローンが「マスター」ベア リポジトリにプッシュし、そこからプルできます。特に一部のコピーが常にオンラインであるとは限らない場合に、同期が少し簡単になります。

注: 「間違った方法」や「最善の方法」はありません。人それぞれ、リポジトリを処理するための独自の好みの方法があります。これは、分散リポジトリ システム (git またはその他) の優れた点の 1 つです。これにより、各ユーザーが自分に最適な作業を行うことができます。

于 2012-07-11T14:06:45.587 に答える