52

git clone --depthコマンドオプションは言う

--depth <depth> 
Create a shallow clone with a history truncated to the specified number of revisions. 
A shallow repository has a number of limitations 
(you cannot clone or fetch from it, nor push from nor into it),
 but is adequate if you are only interested in the recent history of a large project with a long history,
 and would want to send in fixes as patches. 

浅いクローンにこの制限があるのはなぜですか? なぜパッチのみのワークフローなのですか?

一部のプロジェクト ワークフローでは、最新のコミットだけを単一のブランチからコーダーに渡してから、コーダーがpushメイン サーバーに (早送りで) 開発できるようにする必要があります。これは、一部はセキュリティ、IP 保護、およびレポのサイズのためであり、一部は、大きなレポが素朴なコーダーにもたらす混乱を減らすためです。これを可能にする git ワークフローはありますか?


更新: Karl Bielefeldt の回答に基づくgit checkout --orphanと、正しい回答になるはずです。ただし、そのブランチだけを新しいユーザーに「複製」し、効果的にプッシュできるようにする必要があります。

マニュアルページには次のように記載されています。

git checkout [-q] [-f] [-m] [[-b|-B|--orphan] <new_branch>] [<start_point>] --orphan

という名前の新しい孤立したブランチを作成し、<new_branch>そこから開始し <start_point> て切り替えます。この新しいブランチで行われた最初のコミットには親がなく、他のすべてのブランチやコミットから完全に切り離された新しい履歴のルートになります。

インデックスと作業ツリーは、以前に を実行したかのように調整されますgit checkout <start_point>。これにより、ルートコミットを<start_point>簡単に実行することで、一連のパスを記録する新しい履歴を開始できます。git commit -a

これは、完全な履歴を公開せずにコミットからツリーを公開する場合に役立ちます。これを実行して、現在のツリーは「クリーン」であるが、完全な履歴には独自のコードや邪魔されたコードが含まれているプロジェクトのオープン ソース ブランチを公開する場合があります。

のパスとはまったく異なる一連のパスを記録する切断された履歴を開始する場合は、作業ツリーの最上位から<start_point>実行して、孤立したブランチを作成した直後にインデックスと作業ツリーをクリアする必要があります。git rm -rf .その後、別の場所からファイルをコピーしたり、tarball を抽出したりして、新しいファイルを準備し、作業ツリーを再作成する準備が整います。

Junio のコメントへの VonC のリンクは興味深いものです。clone <branch> --optionsこの場合、マニュアルでガイダンスを提供し、適切なコマンド [eg ] でレポの関連部分だけを抽出できるようにする必要があると思います。pushリポジトリの一致をロックダウンする履歴の下部にいくつかのリンクされたコミットと SHA1 があることで、明らかに成功の可能性が高まります。


Git 1.9.0 の更新: リリース ノート 14 Feb '14。

「浅くクローンされたリポジトリからのフェッチは、主に関連するコードパスが慎重に吟味されておらず、そのような使用法をサポートしていなかったため、禁止されていました。このリリースでは、浅くクローンされたリポジトリからより制御された方法でオブジェクトを転送できるようにします。 (つまり、レシーバーは切り捨てられた履歴を持つ浅いリポジトリになります)。」

これは、浅いクローン作成者にとって朗報です。次へ - 狭いクローンの可能性。

4

3 に答える 3

22

濱野純雄(Gitのメインメンテナー)が言うように

ルールは多かれ少なかれ次のようではありません:

浅いリポジトリの履歴が十分に長くならず、他のリポジトリが切り捨てられた履歴の前に分岐した場合、共通の祖先を計算できず、プッシュできません。

2014年の更新:「gitclone --depth 1(浅いクローン)はそれが理解するよりも便利ですか?」を参照してください:その制限はGit 1.9で解除されます!

2015年の更新:Git 2.5以降では、単一のコミットをフェッチすることもできます。「リモートgitリポジトリから特定のコミットをプルする」を参照してください。


元の回答(2011年8月):

実際、考えてみると、「コモンを計算できない」よりもはるかに強力です。

履歴は次のようになります。

          R---R---R
         /
  --R---R---X---X---S---S---S

S浅いリポジトリにあるコミットはどこにありR、プッシュを受け取るリポジトリに存在するコミットはどこにありますか。
履歴が浅いため、どちらのリポジトリにもX、受信者リポジトリの履歴を完全に保つために存在する必要のあるコミットである''がありません。そもそも受信者は浅くないので、浅くしたくありません。

しばらく前に浅くクローンを作成し、反対側が進行している間、反対側と通信せずに作業した場合、および反対側の進行に履歴の巻き戻しと再構築が含まれている場合、同様のトポロジが表示されます。
上の図の左端の' S'は、深さ1で浅くクローンを作成したときのブランチの先端であった可能性があり、それ以降、リモートエンドは最上位の3つのコミットを破棄し、右端の''につながる履歴を再構築した可能性がありますR
このような場合、リモートへのプッシュHEADは失敗します。


したがって、場合によっては機能する可能性がありますが、サポートされていません。

私がこれについて何かを言わなければならないなら...

  • 「サポートされていない」というのは、十分な情報を提供するための簡潔な方法だと思いますが、それは知的な人々にしか効果がありません。

  • 誰もが頭が良いわけではありません。自分で試してみて、限られた回数の試行で操作が機能するように見えることを確認し、ほとんどの場合は機能すると結論付ける人もいます
    そして彼らは、「常に」ではなく「ほとんどの場合」と言ったことに対する彼ら自身の知性を祝福します。
    そして、彼らは警告されたとしても、それが機能しないのを見ると動揺します。


シャロークローンの更新プロセスの詳細については、「gitシャロークローンを更新する方法」を参照してください。

于 2011-08-01T15:06:38.733 に答える
11

これを可能にする git ワークフローはありますか?

はい、パッチとして修正を送信するためです。 git format-patchこれを可能にするために特別に設計されています。詳細をグーグルで調べたい場合は、「ゲートキーパー」ワークフローと呼ばれます。組織が「セキュリティと IP 保護」に関心を持っているとは信じがたいです。実際のビルドに組み込む前に、1 人または小さなグループが「信頼されていない」変更を精査する責任を負っているようなものをまだ使用していないからです。


あなたのコメントに基づいて、私は今あなたの要件をよりよく理解しています. 私がお勧めするのは、孤立したブランチを作成することです ( git checkout --orphanを参照してください)。それらの開発者がアクセスできる別のリポジトリにそのブランチのみをクローンし、そのリポジトリから通常どおりにクローン、プッシュ、およびプルできるようにします。

次に、変更を公式の保護されたリポジトリに再統合する必要がある場合は、ブランチをプルしてコピーを作成しgit branch、元の孤児を上書きしないようにして (後でプロセスを繰り返したい場合に備えて)、コピーをリベースします。元の分岐点に移動し、通常どおりマージします。履歴は、保護されたリポジトリから直接作業したように見えます。

通常よりも少し複雑ですが、それは追加の分離のために支払われた代償です.

于 2011-08-01T16:47:31.130 に答える