6

これがシナリオです。私は「デスクトップ」と「ラップトップ」の2台のマシンを持っています。

デスクトップでは:

mkdir git_test
cd git_test
git init
dd if=/dev/urandom of=test.img bs=1k count=1000
git add test.img
git commit -m "Added first image"

それからラップトップで私はします:

git clone [USER]@desktop:/home/[USER]/git_test    
cd git_test
dd if=/dev/urandom of=test2.img bs=1k count=1000
git add test2.img
git commit -m "Added second image"

次に、デスクトップのgitレポジトリをラップトップのgitレポジトリのように見せたいと思います。ラップトップで、私は以下を発行します:git push origin master

しかし、それから私は得る:

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'.

これら2つのリポジトリの同期を維持するにはどうすればよいですか?

エラーメッセージは、gitが私が望む機能を持っていることを示唆しているようですが、何らかの理由で、より高度なワークフローのようです。あなたが現在いるブランチにプッシュすることはできないと誰かが言ったのを聞いたことがありますが、誰かが可能な解決策としてそれについて詳しく説明できますか?その性質のソリューションには問題はありません。つまり、ラップトップの特定のブランチとデスクトップの別のブランチで作業し、それらを何らかの方法で同期して同一にすることができます。

次の点に注意してください!

  • いくつかの理由から、githubのような一元化されたリポジトリを使用したくありません。1つ目はセキュリティです。2つ目はシンプルさです。3つ目は、ここには立ち入らない状況のため、リモートサーバーへのインターネット接続を期待できず、2台のマシンをLAN経由で接続しているだけです。最後に、その特定の知識を得るために、ここで要求した方法で物事を行う方法を学びたいと思います。

  • また、裸のレポジトリにはルートディレクトリにたくさんのがらくたがあるので、裸のレポジトリは使いたくありません。これは醜くて厄介です。私がsubversionからgitに移行した理由は、gitがはるかにクリーンで分散型のソリューションのように見えたからです。また、デスクトップのルートディレクトリで操作する技術者以外の人もいますが、彼らは雑然とかなり混乱します。gitの美しさは(私が思ったように)すべてが.gitフォルダーに隠れていることです。編集:どうやら私はこの点で十分に明確ではありませんでした。mydata1とmydata2のサブフォルダーを持つ「Documents」フォルダーがあるとします。これは不自然な例ではありません。これはまさに私が対処しようとしている問題です。mydata1には、「test.img」とそのファイルのみが含まれている必要がありますが、代わりに次のファイルが含まれています。

    ブランチ構成の説明HEADフック情報オブジェクト参照

mydata1にCDを挿入してファイルの編集を開始できるようにしたかったのですが、代わりに、ブランチなどをCDで処理して、作業を完了する必要があります。そして、「ドキュメント」にあったすべてのサブフォルダにこの種のディレクトリ構造を持たせることは、まったく機能しません。どうか、このようにするように言わないでください。質問に答えてください。ありがとう。

これらの2つのポイントが、私がこの質問をここに投稿する理由ですこの質問に対する回答がある場合にのみ返信してください。:) ありがとう!!

4

4 に答える 4

12

これを行う1つの方法は、押すのではなく、引くことです。2台のマシンをセットアップした後、最初のマシンで:

git remote add origin [USER]@laptop:/home/[USER]/git_test
git pull # Complains about untracked branch while adding the branch you want to track
git branch --set-upstream master origin/master
git pull

これで、どちらのマシンからもコミットをプルできます。プッシュしたいのなら、分散型のセットアップでそれをどうやってやるのかわかりません。

于 2013-01-17T01:55:42.757 に答える
2

最近、サーバーとデスクトップが同期しなくなるという問題が発生しました。しばらくウェブを検索した後、自分の正確な状況に対応する答えを見つけることができませんでした。そこで、Rackspaceサポートに電話したところ、オンラインで見つけるよりも良い答えだと思うものを提供してくれました。

この特定のスレッドは私の問題に最も近いので、将来誰かが同じ問題に遭遇した場合に備えて、ここで問題を解決した方法を共有したいと思いました。

何が悪かったのか

私はMagento用のSweetToothプラグインをインストールしようとしていて、Magento拡張機能をインストールするために私たち全員が行う通常の手順に従いました。これは、大量のファイルを取得して、それらをApp、JS、およびSkinディレクトリに配置することを意味します。

app / design / adminhtmlディレクトリには、「base」フォルダがあります。Magentoについて何か知っているなら、ベースファイルをいじることについて無数の警告があることを知っています。要するに-それをしないでください。

私のローカルリポジトリには「ベース」ディレクトリがなかったので、ローカルマシンに置いても大丈夫だと思いました。残念ながら、これは私が追加したときに、SweetToothのファイルのみを含む「ベース」ディレクトリを追加したことを意味しました。次にこれをサーバーに置くと、ベースディレクトリ全体とブームが一掃されました。Magentoがダウンしました。

幸い、次の救命コマンドを使用して、以前のサーバー状態に戻すことができました。

git reset --hard HEAD @ {1}

このコマンドを使用すると、前のコミットに戻り、すぐにすべてが正常に戻ります。もちろん、サーバーが1コミット遅れたため、サーバーとデスクトップが同期しなくなりました。

怪我に侮辱を加えるために、私は非常に愚かな間違いを犯し、コンピューターから拡張機能のファイルを削除し、デスクトップで別のコミットを行ったため、サーバーとデスクトップが2つのコミットによって同期しなくなり、gitのキャッシュにこれらのファイルが含まれるようになりました。

これが私がそれを解決した方法です

明らかに、これはかなり厄介な場所にあなたを残します。なぜなら、私のサーバーでgit pullを実行すると、毎回私の「ベース」ディレクトリが消去されるからです。また、2つのコミットが先にあるため、1つのコミットをロールバックすることはできません。

私はこの時点で私の頭の中で神であるRackspaceに電話し、サーバー側とデスクトップ側のどちらからこれを実行するかによって、これを解決する2つの異なる方法を見つけました。

結局のところ、ファイルがデスクトップに存在しなくなったため、サーバー側からこれを行うことはできません。彼らはgitcommit-aを実行し、次にサーバーからプッシュしてからデスクトップからプルすることを推奨しましたが、これは機能しませんが、ファイルはデスクトップ上にありません。

したがって、デスクトップから修正する必要があり、それらのdarnファイルをキャッシュから取得する必要があります。

デスクトップからの同期の問題の修正

ファイルをキャッシュから取り出すために、次のコマンドを何度も何度も発行し、削除したファイルもgitに従って削除されるようにしました。

git rm -r --cached / folder / directory for directorys

git rm --cached / folder / file for files

これがキャッシュからなくなったので、コミットを実行し、最終的にこれらのファイルが実際になくなったことをgitに通知することができました。

これに続いて、マスターへのプッシュが行われました。その後、あとはサーバーとビオラからプルしてビジネスに戻るだけでした。

**結論と教訓**

ここで学んだ教訓はいくつかの大きなものでした。私は、同じような問題を抱えている他のプログラマーのためにこの投稿を書いています。

  1. サーバー上にあるローカルリポジトリにフォルダがない場合は、ファイルが数個しかないローカルリポジトリに追加しないでください。これにより、サーバー上のディレクトリがゼロになります。

  2. 誤って失敗した場合は、必ずgitでファイルを削除してください。ローカルのファイルシステムからファイルを削除しないでください。

  3. git rest --hard HEAD@{1}は時々あなたの親友になることができます

これが同じような状況にある他の人に役立つことを願っています。私はオンラインでドキュメントを注いで何時間も費やしましたが、ここで遭遇した複雑さで何も見つけることができなかったので、誰かが時間を節約し、白髪を少し減らすのを手伝うことができれば、私の悪夢は世界にいくらか役立つでしょう!!

于 2013-11-12T06:52:14.770 に答える
1

ベアレポを使用したくない理由がわからない可能性があります。プルオンリーソリューションは問題なく機能するはずですが、ベアレポを使用する場合は、「残骸」を希望どおりに隠すことができると思います。 。

デスクトップでは、次の場合:

mkdir git_test
git init --bare git_test

その後:

git clone bare_repo_directory new_location

クローンからベアリポジトリ(デフォルトではオリジンと呼ばれます)に通常どおりプッシュおよびプルでき、そこに含まれる余分なコンテンツを処理する必要はありません。クローンには.gitディレクトリのみが含まれます。

プッシュするには、以下を実行する必要があります。

git push origin master (assuming you're working out of master)

あなたのラップトップの場合:

git clone [USER]@desktop:path_to_bare

また、複製されたコピーでは正常に動作するはずです。オリジン(ベアレポジトリ)からプッシュおよびプルしますが、直接作業する必要はありません。

于 2013-01-17T02:09:15.353 に答える
1

プッシュが機能しない理由は、まさにあなたが言っていることです。デフォルトでは、そのリポジトリ(プッシュを受信するリモート)の現在のワークスペースが同じブランチを指している場合、ブランチにプッシュすることはできません。したがって、リモコンがmaster現在チェックアウトされている場合は、にプッシュすることはできませんmaster

2つの簡単な解決策:

リポジトリにすでにコミットがある場合は、ハッシュを直接チェックアウトするだけで、ヘッドレス状態になります。つまり、どのブランチにもいません。

> git checkout <any-hash>
Note: checking out '<any-hash>'.

You are in 'detached HEAD' state...

にプッシュしたい場合は、新しいリポジトリを使用する別の方法は、masterその最初のブランチを名前のない別のブランチに変更することですmaster

> git symbolic-ref HEAD refs/heads/non-existent

masterこれにより、コミットのないブランチで、新しいリポジトリの場合と同様の状態になります。マスターをつかむことはないので、プッシュを受け取ることができます。

于 2013-01-18T01:59:52.973 に答える