web-dev-qa-db-ja.com

gitシャロークローンを更新する方法は?

バックグラウンド

(tl; drについては、下記の#questionsを参照)

複数のgitリポジトリのシャロークローンがあります。浅いクローンを使用しているのは、深いクローンに比べてはるかに小さいためです。それぞれがgit clone --single-branch --depth 1 <git-repo-url> <dir-name>についてクローン化されます。

これはうまく機能しますが、更新方法がわかりません。

タグでクローンを作成する場合、タグは特定の時点でフリーズされるので、更新は意味がありません(理解できます)。この場合、更新したい場合、これは別のタグでクローンを作成することを意味するので、rm -rf <dir-name>して再度クローンを作成します。

マスターブランチのHEADを複製し、後で更新したい場合は、事態はさらに複雑になります。

git pull --depth 1を試しましたが、リモートリポジトリに何もプッシュしませんが、自分が誰なのかわからないと文句を言います。

git fetch --depth 1を試しましたが、何かを更新しているように見えますが、最新ではないことを確認しました(リモートリポジトリの一部のファイルは、クローンのコンテンツとは異なるコンテンツを持っています)。

https://stackoverflow.com/a/20508591/279335 の後、git fetch --depth 1; git reset --hard Origin/masterを試しましたが、2つのこと:最初にgit resetが必要な理由がわかりません。 、ファイルは最新のようですが、いくつかの古いファイルが残り、git clean -dfはこれらのファイルを削除しません。

ご質問

git clone --single-branch --depth 1 <git-repo-url> <dir-name>でクローンを作成しましょう。 rm -rf <dir-name>; git clone --single-branch --depth 1 <git-repo-url> <dir-name>と同じ結果を得るために更新する方法は?または、rm -rf <dir-name>であり、唯一の方法で再度クローンを作成しますか?

注意

これは メインリポジトリサイズを増やすことなく浅いクローンサブモジュールを更新する方法 の複製ではありません知らない)。

25
Hibou57

浅いクローン更新プロセス自体については、 commit 649b0c form Git 2.12(Q1 2017)を参照してください。
そのコミットは次の一部です。

Commit 649b0ccommit f2386c6commit 6bc3d8ccommit 0afd307 (06 Dec 2016)by Nguyễn TháiNgọcDuy(pcloudscommit 1127b3ccommit 381aa8e (2016年12月6日)by Rasmus Villemoes(_ravi-prevas_) を参照してください。 浜野邦夫-gitster- in commit 3c9979b 、2016年12月21日)

_shallow.c_

このPaint_down()58babff(shallow.c:.git/shallowの新しいコミットを選択するための8つのステップ-2013-12-05) のステップ6の一部です。
浅いリポジトリからフェッチする場合、新規/更新された参照のいずれかが_.git/shallow_の新しい「浅いコミット」を必要とするかどうかを知る必要があります(これらの参照の履歴が十分にないため)そしてどれ。

ステップ6の質問は、リポジトリ全体で到達可能性を維持するために履歴を短くするために、他のどの(新しい)浅いコミットが必要ですか?
答えるには、既存の参照から到達可能なすべてのコミットをUNINTERESTING( "_rev-list --not --all_")でマークし、浅いコミットをBOTTOMでマークします。次に、新規または更新されたrefごとに、興味のないものまたはボトムを押して、コミットの参照をマークします。

すべてのウォーキングが完了したら、新しい浅いコミットをチェックします。新しい浅いコミットでマークされた新しい参照が表示されていない場合、履歴と_.git/shallow_を使用して、すべての新しい参照または更新された参照に到達できることがわかります。
問題の浅いコミットは不要であり、破棄できます。

だから、コード。

ここでのループ(コミットをウォークスルーする)は、基本的に次のとおりです。

  1. キューから1つのコミットを取得します
  2. sEENまたは興味のない場合は無視します
  3. マークする
  4. すべての両親を通過し、..
    • 5.a以前にマークしたことがない場合はマークします
    • 5.bキューに戻す

このパッチで行うことは、必要ではないため、ドロップステップ5aです。
5aでマークされたコミットはキューに戻され、次の反復のステップ3でマークされます。マークされない唯一のケースは、コミットがすでにUNINTERESTINGとマークされている場合です(5aはこれをチェックしません)。これはステップ2で無視されます。

3
VonC