14

私がやりたいこと: (sshリモートアクセス可能な)大学のマシンで、gitソース管理下に置いたプロジェクトに取り組んでいます(git initその後git commit -a、すべての変更後、すべて正常に動作します)。今、私は自宅のプライベートマシンでそのプロジェクトに取り組みたいと思っています。gitは分散VCなので、簡単なはずですよね?

私はgitチュートリアルを読みました。これはgit pull、自宅で変更を行うために大学で行うことを提案しています。自宅のマシンにリモートアクセスできないため、これは機能しません。だから家でやろうと思ったgit push。それは機能しますが、非ベアリポジトリはプッシュ用に設計されていないためgit reset、複雑です(後で大学で必要になるなど)。

質問1:セットアップにベアリポジトリを追加するよりも簡単な方法はありますか(つまり、(1)「メイン」ベアリポジトリ、(2)大学のワーキングコピー、(3)ホームワーキングコピーがあります) )?
<Rant>本当にそのセットアップが必要な場合は、SVNにとどまることができたでしょう。</ Rant>

質問2:そのセットアップが本当に必要な場合、どうすればそのベアリポジトリを作成し(おそらくgit clone --bare)、それを「メイン」リポジトリにすることができます。つまり、そこgit pushに行くことになっている作業コピーを伝えることができます。

PS:ベア以外のリポジトリにプッシュできる受信後のフックが浮かんでいることは知っています。試してみましたが、大学のマシンのgitバージョンがかなり古く(1.5.5.6)、フックで使用されるいくつかのコマンドが欠落しているため、うまく機能しませんでした。更新はオプションではありません。とにかくサードパーティのスクリプトを使用しないソリューションをお勧めします。

4

3 に答える 3

14

リモート作業コピーの下からラグを効果的に引っ張るので、チェックアウトされたブランチにプッシュするべきではありません。その場合、ブランチヘッドが移動したために作業ツリーが変更された場合、またはによって失われるローカル変更もあった場合は、解決が困難になりますreset --hard

最も簡単なことは、別のブランチにプッシュすることです。次に、リモートマシンにアクセスして作業する必要があるときに、これを作業コピーのチェックアウトブランチにマージ(またはローカルブランチをリベース)できます。

家から:

git push origin HEAD:from-home

仕事から':

git merge from-home

設定をデフォルトで特定のプッシュrefspecに設定できます。

例えば

git config remote.origin.push +master:from-home

多くの場合、ベアリポジトリの方が自然です。既存のリポジトリからクローンを作成するか、私が通常行うように、新しいリポジトリを初期化して、既存のリポジトリから目的のマスターブランチをプッシュすることができます。

さらに、各場所で作業コピーを使用する場合は、このトリックを使用して、特別に名前が変更されたブランチではなく、リモートのリモートを直接変更することをお勧めします。

したがって、オリジンで「ホーム」と呼ばれるリモートを作成します。ネットワーク構成が原因で、明らかにそこからフェッチすることはできません。それは問題ではありません。

自宅で、「オリジンにプッシュするときに、ホームという名前のオリジンのリモートを更新してもらいます。

git config remote.origin.push +master:home/master

今、物事は本当に滑らかになります。ホームから実行git push originし、オリジンに移動して実行するか、git statusまたはgit branch -a -v-「マスターはホーム/マスターより3コミット遅れており、早送りできます」のように表示されます。

つまり、homeを使用してoriginのリモートのhomeという名前の変更をプッシュすることは、originを使用してhomeからプルすることと機能的に同じです。

ここでの1つの欠点は、ホームに追加のブランチを作成するときに、新しいgitconfig設定を継続的に行う必要があることです。これは、ネットワーク設定に支払うオーバーヘッドです。ありがたいことに、これは単純で、ブランチの作成ごとに1回だけ発生します。

于 2010-01-24T13:27:34.220 に答える
1
  1. この質問は、2つの作業コピーを同期しようとした私の経験を要約したものです。結局、私は、裸のリポジトリを持つ方がより自然で簡単だと思いました。これは、SVNの意味での「メイン」リポジトリではありません。たとえば、ユニとホームに1つずつ配置し、それらの間でプッシュプルすることができます。

  2. 誰かがベアリポジトリをプッシュターゲットとして設定する適切な方法を投稿するでしょうが、ドキュメントを見ずに、作業コピーを削除して、ベアリポジトリから再度クローンを作成します。

于 2010-01-24T13:20:11.367 に答える
1

git-bundleを使用してこの問題を解決しました。私のラップトップではgit pull、アップストリームの変更を取得するために実行します。予想どおり、これはsshで機能します。次に、git bundleローカルの変更をバンドルに入れ、バンドルファイルをリモートサーバーにコピーしてから、サーバーにsshで接続しgit pull、バンドルファイルから実行します。

ドキュメントから:

一部のワークフローでは、あるマシンの開発の1つ以上のブランチを別のマシンに複製する必要がありますが、2つのマシンを直接接続できないため、インタラクティブなGitプロトコル(git、ssh、http)を使用できません。このコマンドは、元のマシンのアーカイブにオブジェクトと参照をパッケージ化し、何らかの手段(スニーカーネットなど)でアーカイブを移動した後、gitfetchとgitpullを使用してそれらを別のリポジトリにインポートすることにより、gitfetchとgitpullが動作するようにサポートします。 。リポジトリ間に直接接続が存在しないため、ユーザーは宛先リポジトリによって保持されているバンドルのベースを指定する必要があります。バンドルは、ベース内のすべてのオブジェクトがすでに宛先リポジトリにあると想定します。

私のリポジトリは十分に小さいので、を使用してgitツリー全体をバンドルに追加でき--allます。ただし、リポジトリが大きい場合は、最近の変更のみをバンドルに追加することをお勧めします(たとえば--since=10.days master、過去10日間を取得するために)。ドキュメントにはさらに多くの例があります。

これが私のコードです。この場合、ラップトップとサーバーの両方が同じ場所にリポジトリを持っています:(~/src/これは非ベアリポジトリ、つまり作業コピーです)。〜/ tmpディレクトリは、サーバーとラップトップの両方に存在します。

TMPDIR=~/tmp
cd ~/src
git pull $server:~/src/
git bundle create $TMPDIR/bundle --all
rsync $TMPDIR/bundle $server:$TMPDIR
ssh $server "cd ~/src;git pull $TMPDIR/bundle"
于 2019-08-31T06:28:54.067 に答える