2012-01-19 11 views
17

カーネルレポが非常に大きいので、私は浅いクローンを行うことができれば私のバージョニングツールをより速く実行させるので、Linuxカーネルレポをクローンしたいです。私の質問の核心は:どのように "n"の値が--depthパラメータのためにあるのかgitに伝えることができますか?私はこれが働くだろう期待していた。特定のタグに浅いクローンをコピーする

gitのクローンhttp://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git --depth v3.0の

感謝。

+0

関連項目[gitリポジトリから古い履歴を削除するにはどうすればよいですか?](http://stackoverflow.com/questions/4515580/how-do-i-remove-the-old-history-from-a- git-repository) – Alberto

答えて

2

残念ながら、--depthのパラメータgit cloneは、クローニングリポジトリを切り捨てるリビジョンの数だけを受け入れます。

可能な解決策は、リポジトリ全体をクローンし、その履歴を切り捨ててv3.0の後にコミットするだけです。ここではどのように-に良いです: 解決のために完全に読むhttp://bogdan.org.ua/2011/03/28/how-to-truncate-git-history-sample-script-included.html

git checkout --orphan temp v3.0 
git commit -m "Truncated history" 
git rebase --onto temp v3.0 master 
git branch -D temp 
git gc 
+0

これは私が提供したソリューションと同様に機能するはずですが、他のすべてのローカル参照を削除し、自分のソリューションに含まれているクリーンアップ手順を実行することもお勧めします。これがなければ、リポジトリにはまだ完全な履歴と余分なオブジェクトが含まれます。このレポでは、約200万のオブジェクトが必要以上にぶら下がっています。 – James

+0

良いメモ、追加 – tomgi

+0

この戦略では、競合するマージを管理する必要があり、マージの処理方法によっては最終マスターの正確なコピーを生成するリスクがあります。レポが非常に大きいので、マージを手動で行うことはほとんどできないので、rebaseコマンドに '-Xours'または' -Xtheirs'オプションを追加することができます。最終的な結果がマスタ参照のソースとは異なることがわかります。 – James

7

が、残念ながら、gitのクローンは、あなたが要求している方法では動作しません。 --depthパラメータは、revisionsの数をcommitsの数に制限しません。コミットの量を制限するクローンパラメータはありません。あなたの状況では、v3.0とレポの最新のHEADの間で最も多く変更されたファイルとの差分が最大10個しかなく、--depth 10を使用しても、リポジトリ履歴のほとんどまたは全部を取得できます。いくつかのオブジェクトは10個までのリビジョンを持つことができないため、リポジトリで最初に登場するまでの履歴をすべて取得します。

ここでは、好きなようにする方法を示します。 問題の鍵は、v3.0と最新のリファレンスをコミットする必要があることです。(それは02f8c6aee8df3cdc935e9bdd4f2d020306035dbeである)、このSHA始まるグラフトポイントを作成V3.0 git log --oneline v3.0^..v3.0

  • のSHAを決定

    • git clone http://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git --depth 10075 smaller_kernel_repo
    • cd smaller_kerenel_repo
    • :ここで私はちょうどそれをするために行った手順です。
    • echo "02f8c6aee8df3cdc935e9bdd4f2d020306035dbe" > .git/info/grafts
    • カーネルログエントリのいくつかの問題を回避するには、export GIT_AUTHOR_NAME="tmp"と素敵な警告はmanページで約あり export GIT_COMMITTER_NAME="tmp"

    • についてのグラフトポイントに従うことによって、歴史を書き換えるgit filter-branch ...そう、今git filter-branchを実行し、後ろに座ると...待って(と待つ虐待をすることができますし、

      git reflog expire --expire=now --all 
      git repack -ad # Remove dangling objects from packfiles 
      git prune  # Remove dangling loose objects 
      

      このプロセスは時間がかかるが、非常に複雑ではありません。)待つ

    今、あなたはすべてをクリーンアップする必要があります。うまくいけば、それはあなたが長期的に望んでいたすべての時間を節約するでしょう。この時点では、本質的に、linux-stable.gitリポジトリからv3.0以降の修正履歴しかないレポです。クローンで--depthを使用した場合と同じように、レポに同じ制限があり、既に持っている履歴からパッチを修正して送信することができます。その周りには方法がありますが、それ自身のQに値する& A.

    私は最後のいくつかのステップをテストしていますが、の操作はまだ進行中です。この投稿には問題があれば更新させていただきますが、それを受け入れていただければこのプロセスを開始することができます。 (致命的:空のident <>許可されていない)問題の

    UPDATE

    回避策。この問題は、Linuxレポのコミット履歴に問題があることに起因します。

    変更git filter-branchコマンドへ:

    git filter-branch --commit-filter ' 
        if [ "$GIT_AUTHOR_EMAIL" = "" ]; 
        then 
          GIT_AUTHOR_EMAIL="[email protected]"; 
          GIT_AUTHOR_NAME='tmp' 
          GIT_COMMITTER_NAME='Me' 
          GIT_COMMITTER_EMAIL='[email protected]' 
          git commit-tree "[email protected]"; 
        else 
          git commit-tree "[email protected]"; 
        fi ' 
    
  • +1

    ここでは、リビジョン*と*コミット*を厳密に区別するのは複雑すぎると思います。私は[正式な違い](http://stackoverflow.com/a/11792712/1127485)を知っていますが、 'git clone --depth 'の文脈で、リビジョンの数は、ヒント。 – sschuberth

    0

    --depthパラメータ数だけ(「リビジョンの指定」)ではなく、タグのようです。

    可能性のあるアイデア(テストする):あなたは、現在のHEADから最新のタグだけでなく、間のコミットの数を取得するためにかかわらずgit describeを使用することができ

    は、タグやHEADを言いました。
    "最新のタグ"があなたのタグでない場合は、その最新のタグで参照されるコミットから、あなたのタグが見つかるまで(例:v3.0)、プロセスを繰り返してください。

    すべてのコミット番号を合計すると、HEADからタグにアクセスできる場合は、git cloneコマンドに与える深さがわかります。

    17

    タグを1の深さにクローニングする方法はありますか?すでに、このコマンドは現在のブランチやタグ5.6の先端間のコミットの数を取得するクローンを持っている人のために

    • git clone --branch mytag0.1 --depth 1 https://example.com/my/repo.git
    +0

    これはどのように**受け入れられた答えではありませんか? – tftd

    1

    $ git rev-list HEAD ^5.6 --count 
    407 
    

    私はこのプロジェクトが実施しましたGitHub APIを使用したrev-list: https://github.com/cjlarose/github-rev-list

    rev-listの非常に長いマニュアルページは、舞台裏で多くのことが起こっていることを示しています。多分、ブランチを数えたり、ブランチやマージを入れたりすることができます。 (?)はいえ、このユースケースでは、おそらく無視することができます

    0

    を作成するには、@少しより完全な答えn8henrie、あなたはこのように、--single-branchオプションを追加することができます。この中

    git clone --single-branch --branch mytag0.1 --depth 1 https://example.com/my/repo.git 
    

    はあなただけを取得しましたこの特定のタグに関連するリポジトリオブジェクトは、私の経験では、多くの場合、かなりのスペースを確保しています。[無]シングルブランチ

    クローンのいずれか--branchオプションまたは主枝リモートのHEADポイントで指定された単一の分岐の先につながる唯一の歴史、 -

    git-clone docsからで。結果のリポジトリへのさらなるフェッチは、このオプションが最初のクローン作成に使用されたブランチのリモート追跡ブランチのみを更新します。 --single-branchクローンが作成されたときに、リモートのHEADがどのブランチも指していなかった場合、リモート追跡ブランチは作成されません。

    追加注:同じコンピュータに別のフォルダからローカルレポのクローンを作成している場合、それはだけではなく、フォルダ名を指定する、file://プロトコルを使用して、それを参照する必要があります。

    関連する問題