web-dev-qa-db-ja.com

--depth 1を使用してクローンを作成し、コミットを作成して再度更新をプルしても安全ですか?

--depth 1git cloneオプション

指定したリビジョン数に切り捨てられた履歴を持つシャロークローンを作成します。浅いリポジトリにはいくつかの制限があります(クローンを作成したり、そこから取得したり、プッシュしたり、プッシュしたりすることはできません)。パッチとして修正を送ってください。

しかし、私は浅いクローンの作成に成功し、いくつかの変更をコミットし、それらの変更を(素クローン)Originにプッシュしました。

それは私にとって理にかなっている - 私はなぜそうではないのですか?複製されたHEADがOrigin内で識別可能で、その上に私のコミットがある場合、理由はありません。しかしマニュアルはそうではないと言います。

私は浅いクローンのアイデアが好きです。 drupal coreについて:7から始めたときにdrupal 4で何が起こっていたのか知​​る必要はありません - しかし、私は自分の足を撃つことを望みません。

それで、浅いクローンを作成し、その中でコミットを作成し、元からの更新に追いつくためにもう一度引っ張っても安全ですか?

260
artfulrobot

Git 1.9/2.0(2014年第1四半期)では、removedという制限があります。
commit 82fba2b を参照。 NguyễnTháiNgọcDuy(pclouds

Gitが浅いクローンからの、または浅いクローンへのデータ転送をサポートするようになったので、これらの制限はもはや当てはまりません。

ドキュメントは現在読んでいます

--depth <depth>::

指定したリビジョン数まで切り捨てられた履歴を持つ「浅い」クローンを作成します。

これは d7d285f2c681c 、および c29a7b8 のようなコミットから生じており、これらはクローン、浅いクローンを含むsend-pack/receive-packをサポートしています。
smart-httpは今や浅いフェッチ/クローンもサポートしています

詳細はすべて " shallow.c.git/shallowのための新しいコミットを選択するための8つのステップ "にあります。

2015年6月に更新: Git 2.5では単一のコミットを取得することもできます
(究極の浅い場合)


2016年1月の更新:Git 2.8(Mach 2016)では、最小限の履歴を取得する方法が正式に文書化されました。
commit 99487cfcommit 9cfde9e (2015年12月30日)、 commit 9cfde9e (2015年12月30日)、 参照) commit(bac5874 (2015年12月29日)、そして commit 1de2e44 (2015年12月28日)、 Stephen P. Smith( ``)
Junio C Hamano - gitster - in commit 7e3e80a に合併、2016年1月20日)

これは " Documentation/user-manual.txt "です

<<def_shallow_clone,shallow clone>>は、 git-clone --depth スイッチを指定することによって作成されます。
深さは、後で git-fetch --depth スイッチを使用して変更することも、--unshallowを使用して全履歴を復元することもできます。

<<def_shallow_clone,shallow clone>>内でのマージは、マージベースが最近の履歴にある限り有効です。
さもなければ、それは無関係な歴史を併合するようなものであり、大きな対立を招かなければならないかもしれません。
この制限により、このようなリポジトリはマージベースのワークフローで使用するのに不適切になる可能性があります。


シャロークローンの更新プロセスの詳細については、「 gitシャロークローンを更新するにはどうすればよいですか? 」を参照してください。


Richard Michael によるコメントの通り:

履歴を埋め戻すにはgit pull --unshallow

そして OlleHärstedt が追加されています コメント内

履歴のpartを埋め戻します。git fetch --depth=100

274
VonC

私の似たような質問に対する答えのいくつか を参照してください。シャントクローンからのプッシュ と最近のスレッドへのリンクgitリスト.

結局のところ、 '深さ'の測定値はリポジトリ間で一貫していません。なぜなら、それらは(a)あなたの頭、(b)あなたがクローン/フェッチしたコミット、(c)何か他のものではないからです。念頭に置いていた.

難しいのは自分のユースケースを正しく(つまり自己矛盾のない)ものにすることなので、分散された、したがって多分異なるリポジトリはまだ一緒にうまく機能するでしょう。

checkout --Orphanは正しい「セットアップ」段階であるように見えますが、それでも「クローン」ステップに関する明確な(つまり、わかりやすい1行のコマンド)ガイダンスがありません。むしろ、レポジトリをinitにし、remoteを追跡するブランチをセットアップし(そして、一つのブランチだけが欲しいですか?)、そしてその単一のブランチをfetchにする必要があるように見えます。

編集: 'クローン'のステップについては、この答えを参照してください

7
Philip Oakley