slackbuildのコレクションを見つけました。GitHubに必要なものがいくつかあります。 https://github.com/PhantomX/slackbuilds/ すべてのgitを取得したくない。
git clone https://github.com/PhantomX/slackbuilds.git
ただし、これの場合はslackbuildのみを取得します。
これを行う方法はありますか?
コメント
- stackoverflow.com/a/13738951/2072269
回答
履歴全体をダウンロードすることになりますので、あまりメリットはありませんが、 「スパース」チェックアウトを使用して特定のパーツをチェックアウトできます。 このStack Overflowの投稿を引用:
スパースを実行する手順クローンは次のとおりです。
mkdir <repo> cd <repo> git init git remote add -f origin <url>
これにより、リモートで空のリポジトリが作成され、すべてのオブジェクトがフェッチされますが、チェックアウトされません。 do:
git config core.sparseCheckout true
次に、実際にチェックアウトするファイル/フォルダーを定義する必要があります。これは、例:
echo "some/dir/" >> .git/info/sparse-checkout echo "another/sub/tree" >> .git/info/sparse-checkout
最後になりましたが、重要なことですが、空のリポジトリをリモートからの状態で更新します:
git pull origin master
拡張チュートリアル。おそらく、公式のスパースチェックアウトのドキュメントを読む必要があります。
浅いクローンを使用した方がよい場合があります。
コマンドを試してください:
git pull --depth=1 origin master
コメント
-
core.sparseCheckout
と.git/info/sparse-checkout
に変更を加えた後、git pullを実行した後、error: Sparse checkout leaves no entry on working directory
を取得しています。 div> - 修正:
git init; git remote ...
設定しただけで、何もダウンロードされません。スパースの要点は、関心のあるオブジェクトのみを取得することです。 - @vonbrand that ‘は
-f
オプションの対象:” -fオプションを使用すると、git fetch < name >リモート情報が設定された直後に実行されます。” -
git remote add -f origin <url>
gitがまだリポジトリ全体をダウンロードしている後。私の場合、リポジトリ全体をチェックアウトしなくても、’それを待つのに時間をかけたくありません。’ / li> - スパースチェックアウトでは、チェックアウトする対象を定義しますが、いくつかのディレクトリを除外して残りをチェックアウトする方法はありますか?
回答
git clone --filter
git 2.19がGitHubで動作するようになりました(2020-09でテスト済み) -18、git 2.25.1)
このオプションはリモートプロトコルの更新とともに追加され、オブジェクトがからダウンロードされるのを本当に防ぎます。サーバー。
たとえば、このリポジトリのd1
に必要なオブジェクトのみを複製するには: https://github.com/cirosantilli/test-git-partial-clone できること:
git clone \ --depth 1 \ --filter=blob:none \ --no-checkout \ https://github.com/cirosantilli/test-git-partial-clone \ ; cd test-git-partial-clone git checkout master -- d1
cloneコマンドは以下のみを取得します:
-
master
ブランチの先端を持つ単一のコミットオブジェクト - リポジトリの4つのツリーオブジェクトすべて:
- コミットのトップレベルディレクトリ
- 3つのディレクトリ
d1
、d2
、master
次に、checkout
コマンドは、サーバーから欠落しているblob(ファイル)のみをフェッチします。
-
d1/a
-
d1/b
さらに良いことに、後でGitHubがサポートを開始する可能性があります:
--filter=blob:none \ --filter=tree:0 \
Git2.20の --filter=tree:0
はすべてのツリーオブジェクトを不要なclone
フェッチし、checkout
に延期できるようにします。しかし、2020-09-18のテストで次のように失敗しました:
fatal: invalid filter-spec "combine:blob:none+tree:0"
おそらく--filter=combine:
複合フィルター( Git 2.24で追加され、複数の--filter
)によって暗示される)はまだ実装されていません。
どのオブジェクトがフェッチされたかを確認しました:
git verify-pack -v .git/objects/pack/*.pack
言及: https://stackoverflow.com/questions/7348698/git-how-to-list-all-objects-in-the-database/18793029#18793029 各オブジェクトが正確に何であるかを明確に示すことはできませんが、各オブジェクトのタイプを示しています(commit
、tree
、blob
)、そしてその最小限のリポジトリにはオブジェクトが非常に少ないので、それぞれが何であるかを明確に推測できますオブジェクトはです。
git rev-list --objects --all
は、ツリー/ブロブのパスを使用してより明確な出力を生成しましたが、実行時に一部のオブジェクトをフェッチするため、判断が困難です。何がいつフェッチされたか、誰かがより良いコマンドを持っているかどうか私に知らせてください。 2020-01-17の https://github.blog/2020-01-17-bring-your-monorepo-down-to-size-with-sparse-checkout/ は、すでに--filter blob:none
について言及しています。
git sparse-checkout
Iこのコマンドは、”これらのサブツリーのみを気にする”という設定ファイルを管理することを目的としているため、今後のコマンドはこれらのサブツリーにのみ影響しますサブツリー。しかし、現在のドキュメントは少し…まばらなので、確認するのは少し難しいです;-)
それ自体では、blobのフェッチを妨げることはありません。
この理解が正しければ、これは上記のgit clone --filter
を補完するのに適しています。これは、部分的にクローン化されたリポジトリでgit操作を実行する場合に、意図しないオブジェクトのフェッチを防ぐためです。 。
Git 2.25.1を試してみたとき:
git clone \ --depth 1 \ --filter=blob:none \ --no-checkout \ https://github.com/cirosantilli/test-git-partial-clone \ ; cd test-git-partial-clone git sparse-checkout init
は実際にはすべてのオブジェクトをフェッチしました。
ただし、Git 2.28では、必要に応じてオブジェクトをフェッチしませんでした。しかし、そうすると:
git sparse-checkout set d1
d1
は、明示的に示されていても、フェッチおよびチェックアウトされません。すべきこと: https://github.blog/2020-01-17-bring-your-monorepo-down-to-size-with-sparse-checkout/#sparse-checkout-and-partial-clones 免責事項付き:
部分クローン機能が一般提供されるように注意してください[1]。
[1]:GitHubは、有効になっている間もこの機能を内部で評価しています。選択したいくつかのリポジトリ(この投稿で使用されている例を含む)。機能が安定して成熟するにつれ、進捗状況を随時お知らせします。
そうですね、確かなことは難しいです。瞬間、GitHubがクローズドソースであることの喜びのおかげもあります。しかし、それを監視しましょう。
コマンドの内訳
サーバーは次のように構成する必要があります:
git config --local uploadpack.allowfilter 1 git config --local uploadpack.allowanysha1inwant 1
コマンドの内訳:
-
--filter=blob:none
はすべてのblobをスキップしますが、それでもすべてのツリーオブジェクトをフェッチします -
--filter=tree:0
は不要なツリーをスキップします: https://www.spinics.net/lists/git/msg342006.html -
--depth 1
はすでに--single-branch
を意味します。
https://stackoverflow.com/questions/1778088/how-to-clone-a-single-branch-in-git
file://$(path)
は、git clone
プロトコルのシェナニガンを克服するために必要です: https://stackoverflow.com/questions/47307578/how-to-shallow-clone-a-local-git-repository-with-a-relative-path
--filter=combine:FILTER1+FILTER2
は、で複数のフィルターを使用するための構文です。一度、何らかの理由で--filter
を渡そうとすると、次のように失敗します:”複数のフィルター仕様を組み合わせることができません”。これは、Git2.24のe987df5fe62b8b29be4cdcdeb3704681ada2b29e ” list-objects-filter:複合フィルターの実装”
編集: Git 2.28では、2020-09-の時点でGitHubがまだcombine:
を実装していないため、--filter=FILTER1 --filter FILTER2
にも同じ効果があることが実験的にわかりました。 18と文句を言うfatal: invalid filter-spec "combine:blob:none+tree:0"
。 TODOはどのバージョンで導入されましたか?
--filter
の形式はman git-rev-list
。
Gitツリーのドキュメント:
- https://github.com/git/git/blob/v2.19.0/Documentation/technical/partial-clone.txt
- https://github.com/git/git/blob/v2.19.0/Documentation/rev-list-options.txt#L720
- https://github.com/git/git/blob/v2.19.0/t/t5616-partial-clone.sh
ローカルでテストする
#!/usr/bin/env bash set -eu list-objects() ( git rev-list --all --objects echo "master commit SHA: $(git log -1 --format="%H")" echo "mybranch commit SHA: $(git log -1 --format="%H")" git ls-tree master git ls-tree mybranch | grep mybranch git ls-tree master~ | grep root ) # Reproducibility. export GIT_COMMITTER_NAME="a" export GIT_COMMITTER_EMAIL="a" export GIT_AUTHOR_NAME="a" export GIT_AUTHOR_EMAIL="a" export GIT_COMMITTER_DATE="2000-01-01T00:00:00+0000" export GIT_AUTHOR_DATE="2000-01-01T00:00:00+0000" rm -rf server_repo local_repo mkdir server_repo cd server_repo # Create repo. git init --quiet git config --local uploadpack.allowfilter 1 git config --local uploadpack.allowanysha1inwant 1 # First commit. # Directories present in all branches. mkdir d1 d2 printf "d1/a" > ./d1/a printf "d1/b" > ./d1/b printf "d2/a" > ./d2/a printf "d2/b" > ./d2/b # Present only in root. mkdir "root" printf "root" > ./root/root git add . git commit -m "root" --quiet # Second commit only on master. git rm --quiet -r ./root mkdir "master" printf "master" > ./master/master git add . git commit -m "master commit" --quiet # Second commit only on mybranch. git checkout -b mybranch --quiet master~ git rm --quiet -r ./root mkdir "mybranch" printf "mybranch" > ./mybranch/mybranch git add . git commit -m "mybranch commit" --quiet echo "# List and identify all objects" list-objects echo # Restore master. git checkout --quiet master cd .. # Clone. Don"t checkout for now, only .git/ dir. git clone --depth 1 --quiet --no-checkout --filter=blob:none "file://$(pwd)/server_repo" local_repo cd local_repo # List missing objects from master. echo "# Missing objects after --no-checkout" git rev-list --all --quiet --objects --missing=print echo echo "# Git checkout fails without internet" mv ../server_repo ../server_repo.off ! git checkout master echo echo "# Git checkout fetches the missing directory from internet" mv ../server_repo.off ../server_repo git checkout master -- d1/ echo echo "# Missing objects after checking out d1" git rev-list --all --quiet --objects --missing=print
Git v2.19.0での出力:
# List and identify all objects c6fcdfaf2b1462f809aecdad83a186eeec00f9c1 fc5e97944480982cfc180a6d6634699921ee63ec 7251a83be9a03161acde7b71a8fda9be19f47128 62d67bce3c672fe2b9065f372726a11e57bade7e b64bf435a3e54c5208a1b70b7bcb0fc627463a75 d1 308150e8fddde043f3dbbb8573abb6af1df96e63 d1/a f70a17f51b7b30fec48a32e4f19ac15e261fd1a4 d1/b 84de03c312dc741d0f2a66df7b2f168d823e122a d2 0975df9b39e23c15f63db194df7f45c76528bccb d2/a 41484c13520fcbb6e7243a26fdb1fc9405c08520 d2/b 7d5230379e4652f1b1da7ed1e78e0b8253e03ba3 master 8b25206ff90e9432f6f1a8600f87a7bd695a24af master/master ef29f15c9a7c5417944cc09711b6a9ee51b01d89 19f7a4ca4a038aff89d803f017f76d2b66063043 mybranch 1b671b190e293aa091239b8b5e8c149411d00523 mybranch/mybranch c3760bb1a0ece87cdbaf9a563c77a45e30a4e30e a0234da53ec608b54813b4271fbf00ba5318b99f root 93ca1422a8da0a9effc465eccbcb17e23015542d root/root master commit SHA: fc5e97944480982cfc180a6d6634699921ee63ec mybranch commit SHA: fc5e97944480982cfc180a6d6634699921ee63ec 040000 tree b64bf435a3e54c5208a1b70b7bcb0fc627463a75 d1 040000 tree 84de03c312dc741d0f2a66df7b2f168d823e122a d2 040000 tree 7d5230379e4652f1b1da7ed1e78e0b8253e03ba3 master 040000 tree 19f7a4ca4a038aff89d803f017f76d2b66063043 mybranch 040000 tree a0234da53ec608b54813b4271fbf00ba5318b99f root # Missing objects after --no-checkout ?f70a17f51b7b30fec48a32e4f19ac15e261fd1a4 ?8b25206ff90e9432f6f1a8600f87a7bd695a24af ?41484c13520fcbb6e7243a26fdb1fc9405c08520 ?0975df9b39e23c15f63db194df7f45c76528bccb ?308150e8fddde043f3dbbb8573abb6af1df96e63 # Git checkout fails without internet fatal: "/home/ciro/bak/git/test-git-web-interface/other-test-repos/partial-clone.tmp/server_repo" does not appear to be a git repository fatal: Could not read from remote repository. Please make sure you have the correct access rights and the repository exists. # Git checkout fetches the missing directory from internet remote: Enumerating objects: 1, done. remote: Counting objects: 100% (1/1), done. remote: Total 1 (delta 0), reused 0 (delta 0) Receiving objects: 100% (1/1), 45 bytes | 45.00 KiB/s, done. remote: Enumerating objects: 1, done. remote: Counting objects: 100% (1/1), done. remote: Total 1 (delta 0), reused 0 (delta 0) Receiving objects: 100% (1/1), 45 bytes | 45.00 KiB/s, done. # Missing objects after checking out d1 ?8b25206ff90e9432f6f1a8600f87a7bd695a24af ?41484c13520fcbb6e7243a26fdb1fc9405c08520 ?0975df9b39e23c15f63db194df7f45c76528bccb
結論:がありません。例えば。d2/b
である0975df9b39e23c15f63db194df7f45c76528bccb
は、d1/a
をチェックアウトした後は表示されません。
root/root
とmybranch/mybranch
もありませんが、--depth 1
はそれを非表示にします。不足しているファイルのリスト。 --depth 1
を削除すると、不足しているファイルのリストに表示されます。
夢があります
この機能はGitに革命をもたらす可能性があります。
企業のすべてのコードベースがあると想像してみてください単一のリポジトリ内 repo
などの醜いサードパーティツールなし。
巨大なblobをリポジトリに直接保存します。サードパーティの拡張機能はありません。
GitHubでスターや権限などのファイル/ディレクトリメタデータごと。これにより、すべての個人的なものを1つのリポジトリに保存できます。
サブモジュールは通常のディレクトリとまったく同じように扱われました:ツリーSHAをリクエストするだけで、 DNSのようなメカニズムがリクエストを解決します。最初にローカルの
回答
これを試してください:
svn export https://github.com/PhantomX/slackbuilds/trunk/${directory}
コメント
- これ最も簡単な方法です。すべてのリポジトリをダウンロードするわけではありません。
/trunk
を追加し、/tree/master
を削除する必要があることに注意してください。詳細こちら - ありがとうございます!リポジトリ内のすべてのフォルダーではなく、リポジトリのフォルダーのクローンを作成したいだけです。そして、これは私にとって本当にうまくいきます。
回答
実用的な解決策:
あなた圧縮をオフにする必要があります:
git config --global core.compression 0
次に、浅いクローンを使用する必要があります
git clone --depth=1 <url>
次に、最も重要なステップは、クローンプロジェクトにCDを挿入することです
cd <shallow cloned project dir>
クローンを開いて、ステップバイステップで
git fetch --depth=N, with increasing N
例
git fetch --depth=4
次に、
git fetch --depth=100
次に、
git fetch --depth=500
このNを置き換えることで、必要なステップ数を選択できます。
最後に、残りのすべてのリビジョンをダウンロードします。を使用して、
git fetch --unshallow
役立つ場合は賛成:)
回答
上記のおかげで、ようやくこれが機能するようになりました。ファイルを直接編集していたのですが、誤って引用符を含めるとエラーが発生しました。 .git / info / sparse-checkoutファイルには、ディレクトリのみを含め、引用符は含めないでください。例を次に示します。この巨大なプロジェクト: https://github.com/SharePoint/sp-dev-fx-webparts 、react-script-editorだけが必要でしたサンプルディレクトリ。 https://github.com/SharePoint/sp-dev-fx-webparts / tree / master / samples / react-script-editor
上記の指示に従い、.git / info / sparse-checkoutファイルにこれが含まれているときに機能しました
samples / react-script-editor
回答
これにより、特定のフォルダーのクローンが作成され、そのフォルダーに関係のないすべての履歴が削除されます。
git clone --single-branch -b {branch} [email protected]:{user}/{repo}.git git filter-branch --subdirectory-filter {path/to/folder} HEAD git remote remove origin git remote add origin [email protected]:{user}/{new-repo}.git git push -u origin master
コメント
- これにより、すべての履歴(
--depth=1
を回避)と他のすべてのディレクトリ(回避しますか?)
回答
GitHubリポジトリの場合、任意のサブを複製できます- https://github.com/HR/github-clone
コメントを使用したGitHubリポジトリのディレクトリ(任意の参照) h3>
- 残念ながら、これはDockerfileシナリオには適していません。これは、Python全体を依存関係として取り込み、イメージのビルド中に1回だけ使用するためです。
回答
私が直面した特定の制限で回答します。
- VSOでは、SSHがセキュリティによって無効にされていたため、gitアーカイブを使用できませんでした。PAT/ CredentialProviderのみがサポートされていました。
- ブランチには膨大なコードが含まれていたため、git cloneそれ自体は最低でも15分かかります。
これが私がしたことです:
- 1回限りの手動プロセス:VSOUIで新しいものを作成しますリモートブランチは、ファイルがゼロの「emptyBranch」と言います(すべて削除されます)。
-
git clone --depth=1 --single-branch --branch emptyBranch <remote>
(かなり速い) -
git checkout <branchToSyncTo> <directoryToSyncTo>
(特定のフォルダーのみをチェックアウトします)