8

私の目的は、長く膨大な歴史を持つプロジェクトの最新バージョンをビルドし、プロジェクトに貢献できるようにすることです。これを行うには、ローカル ストレージを使用して多くの歴史的なブランチや 10 年以上前の歴史を複製する必要はありません (必要に応じて、プロジェクトの中央リポジトリの Web UI でいつでも検索できますが、おそらくしないでしょう)。

私は最初の試みでラッキーだったようです:

git clone --depth 40 -b master http://github.com/who/what.git/ what

これにより、' ' ブランチのみを持つ 'what' の整然としたローカル クローンと、masterタグ付けされた最新の 2 つのリリースをカバーするのに十分なコミットが得られました。
その後、' git checkout latest-release-tag' を実行して、最新のリリースをビルドできます。ヤッピー!

予想通り、パッチを作成する必要がありました。すべてがスムーズに進みました: ' git checkout -b my-patch-branch'、変更を加え、コミットすると、プロジェクトがプルできるように、my-patch-branch を github のクローンにプッシュすることができました。簡単!ここで読んだことから、g​​it 1.9 の前にそれを行うことはできなかった
ので、そこで幸運だったと思います。 しかし、インストールされたバージョンは 1.9 であることが判明したので、それを回避しました。

次にやりたいことは、リモートからフェッチし、マスターで最新のアクティビティを取得することです (パッチのアップストリーム マージを含むため、そのブランチはもう必要ありません)。私は 'git fetch --dry-run アップストリーム' を試してみましたが、無限にメガバイトのダウンロードが行われ、マストドンの時代にさかのぼる新しいタグのリストが表示されるのを恐怖で見ていました。言ってよかった--dry-run

私のクローンの HEAD 以来、 ' ' でダースかそこらの新しいコミットが取得されることを本当に望んでいたのでmaster、おそらく 40 ではなく深さ 52 のクローンを持つことになるでしょうが、それは私が望んでいることのようなものです ...私が関与する前の有用な量の最近の履歴から始めて、その時点から追跡して成長させ、パッチをビルド、ブランチ、およびプッシュできるようにします。とても近いようです。

私がやろうとしていることをgitに実行させる簡単な方法はありますか? 私がやろうとしていることは不合理ですか?

編集:もう少し情報。
(1) アップストリームは実際には 100 コミ​​ット近く私より進んでいます。
(2) クローンで取得した元の 40 個のコミットはすべて片親コミットであることがわかりました。私がフェッチしようとしている後のものの束は、クローンに含まれていなかったブランチの2番目の親とのマージコミットです。私のクローンの最初のコミットは共通の祖先ではないため、それらが原因で git が古い歴史をすべて取り込んでいる可能性はありますか?
いらないと伝える方法はありますか?

さらに新しい情報:
(1) 以前は http プロトコルを使用していましたが、これは実際にはサーバー上の git プロセスと対話しないため、ダウンロード サイズを調整する機会がありません。
しかし、git-over-ssh を使用して再試行すると、まだ大量のフェッチが発生しました。
次に
(2) 手動で、動物のように、github の「newtork」ディスプレイに表示されているマージ コミットをクリックし、浅いカットの前に始まったブランチを含むコミットを見つけ、それらの親 2 SHA を.git/shallowファイルに追加し試してみました。再び ssh 経由で「git fetch」します。それはうまく機能し、私のローカルを早送りできる小さなパックファイルをダウンロードしましたmasterブランチ。これはまさにgitに自動的に実行してもらいたい操作だと思いますが、それを行う方法が見つかりませんでした。手動では、かなり面倒です。:)

4

2 に答える 2

3

どの値を渡す必要がありますか? 最初に深さ 40 でクローンを作成し、アップストリームに 100 個の新しいコミットがある場合、深さ 140 を要求する必要がありますか?

Git 2.11 (2016 年第 4 四半期) では深さを増やすことができるため、フェッチによって 100 個の新しいコミットがもたらされる場合は、新しい深さを 140 に設定できます。

CCCF74Eのコミット、コミット079AA97コミット2997178コミットCDC3727コミット859E5DFコミット859E5DF A45A260コミットコミット269A7A8 コミット41DA711 コミットメント508888888888888888888888888888888888888888888888888888888888888888888888のコミットメントを参照してください45a3e52コミット 3f0f662コミット 7fcbd37コミット 6e414e3(2016 年 6 月 12 日) Nguyễn Thái Ngọc Duy ( pclouds)著。
支援者: Duy Nguyen ( pclouds)Eric Sunshine ( sunshineco)、およびJunio C Hamano ( gitster)
( 2016 年 10 月 10 日にコミット a460ea4Junio C Hamanoによってマージされました)gitster

特に、cccf74e をコミットします

fetch, upload-pack:コミット--deepen=Nによって浅い境界を拡張しますN

ではgit fetch--depth引数は常に最新のリモート参照に対して相対的です。
これにより、ユーザーが浅い履歴 (たとえば 3 レベル深く) を作成したい場合に、このユース ケースをカバーすることが少し難しくなります。
リモート参照がまだ移動していない場合は機能しますが、特にそのユースケースが最後のクローンまたは " git fetch --depth" から数か月後に実行される場合は、誰もそれを保証できません。
また、 を使用して浅い境界を変更しても、または--depthで作成されたクローンではうまく機能しません。--since--not

このパッチはそれを修正します。
新しい引数は、リモート参照がどこにあるかに関係なく、現在の履歴にさらに (*) 個の親コミットを--deepen=<N>追加します。<N>

(*)が負の--deepen=<N>場合もサポートできます。 その場合、浅いクローンから一部の履歴を切り取ることができます。この操作 (および) は、リモート側とのやり取りを必要としません (結果として、実装がより複雑になります)。<N>
--depth=<shorter depth>


Git 2.27 (2020 年第 2 四半期) より前は、" git pull" は基盤となる " " と多くのオプションを共有してgit fetchいましたが、それらの一部は文書化されておらず、継承する意味のあるものも継承されていませんでした。

つまり、リポジトリの履歴を深め、現在のブランチをすべて 1 つのコマンドで更新できます。

git pull --deepen=x

コミット 13ac5edコミット f05558f (2020 年 3 月 28 日) by René Scharfe ( rscharfe)を参照してください。
( 2020 年 4 月 22 日にコミット 9f471e4Junio C Hamanoによってマージされました)gitster

pull: 文書化されたフェッチ オプションを渡す

報告者: 天几署
名者: René Scharfe

フェッチ オプション--deepen--negotiation-tip--server-option--shallow-exclude、および--shallow-sinceも同様に文書化さgit pullれていますが、実際にはそのコマンドでは受け入れられません。

それらを渡して、コードをドキュメントと一致させます。

于 2016-10-12T11:13:59.513 に答える