我正在使用包含大量文件的存储库,这需要几个小时才能结账.我正在研究Git是否能够很好地使用这种类型的存储库,因为它支持稀疏检出,但我能找到的每个示例都执行以下操作:
git clone <path>
git config core.sparsecheckout true
echo <dir> > .git/info/sparse-checkout
git read-tree -m -u HEAD
Run Code Online (Sandbox Code Playgroud)
这个命令序列的问题是原始克隆也执行结帐.如果将-n添加到原始克隆命令,则read-tree命令会导致以下错误:
错误:稀疏结账不会在工作目录上留下任何条目
如何在不先检出所有文件的情况下进行稀疏结账?
ape*_*arr 155
请注意,此答案确实从存储库下载了完整的数据副本.该git remote add -f命令将克隆整个存储库.从手册页git-remote:
使用
-f选项,git fetch <name>在设置远程信息后立即运行.
试试这个:
mkdir myrepo
cd myrepo
git init
git config core.sparseCheckout true
git remote add -f origin git://...
echo "path/within_repo/to/desired_subdir/*" > .git/info/sparse-checkout
git checkout [branchname] # ex: master
Run Code Online (Sandbox Code Playgroud)
现在你会发现你有一个"修剪过的"结账,只有来自path/within_repo/to/desired_subdir的文件存在(并且在那个路径中).
请注意,在Windows命令行上,您不能引用路径,即您必须使用以下命令更改第6个命令:
echo path/within_repo/to/desired_subdir/* > .git/info/sparse-checkout
Run Code Online (Sandbox Code Playgroud)
如果你不这样做,你将在稀疏结帐文件中获得引号,它将无法正常工作
Ale*_*nko 56
2020 年有一种更简单的方法来处理稀疏结账,而不必担心 .git 文件。这是我如何做到的:
git clone <URL> --no-checkout <directory>
cd <directory>
git sparse-checkout init --cone # to fetch only root files
git sparse-checkout set apps/my_app libs/my_lib # etc, to list sub-folders to checkout
# they are checked out immediately after this command, no need to run git pull
Run Code Online (Sandbox Code Playgroud)
请注意,它需要安装 git 2.25 版。在此处阅读更多相关信息:https : //github.blog/2020-01-17-bring-your-monorepo-down-to-size-with-sparse-checkout/
更新:
上面的git clone命令仍然会克隆具有完整历史记录的 repo,但不会检出文件。如果不需要完整的历史记录,可以在命令中添加--depth参数,如下所示:
# create a shallow clone,
# with only 1 (since depth equals 1) latest commit in history
git clone <URL> --no-checkout <directory> --depth 1
Run Code Online (Sandbox Code Playgroud)
oni*_*ake 39
Git clone有一个选项(--no-checkout或-n)可以满足您的需求.
在您的命令列表中,只需更改:
git clone <path>
Run Code Online (Sandbox Code Playgroud)
对此:
git clone --no-checkout <path>
Run Code Online (Sandbox Code Playgroud)
然后,您可以使用问题中所述的稀疏结账.
sou*_*ica 18
我有一个类似的用例,除了我只想检查标签的提交并修剪目录.使用--depth 1使它非常稀疏,可以真正加快速度.
mkdir myrepo
cd myrepo
git init
git config core.sparseCheckout true
git remote add origin <url> # Note: no -f option
echo "path/within_repo/to/subdir/" > .git/info/sparse-checkout
git fetch --depth 1 origin tag <tagname>
git checkout <tagname>
Run Code Online (Sandbox Code Playgroud)
小智 10
我从pavek早先发布的单行中找到了我想要的答案(谢谢!)所以我想在一个适用于Linux(GIT 1.7.1)的单一回复中提供完整的答案:
1--> mkdir myrepo
2--> cd myrepo
3--> git init
4--> git config core.sparseCheckout true
5--> echo 'path/to/subdir/' > .git/info/sparse-checkout
6--> git remote add -f origin ssh://...
7--> git pull origin master
Run Code Online (Sandbox Code Playgroud)
我稍微改变了命令的顺序,但似乎没有任何影响.关键是在步骤5中路径末尾存在尾部斜杠"/" .
可悲的是,以上都没有为我工作,所以我花了很长时间尝试不同的sparse-checkout文件组合.
在我的情况下,我想跳过具有IntelliJ IDEA配置的文件夹.
这是我做的:
跑 git clone https://github.com/myaccount/myrepo.git --no-checkout
跑 git config core.sparsecheckout true
创建.git\info\sparse-checkout以下内容
!.idea/*
!.idea_modules/*
/*
Run Code Online (Sandbox Code Playgroud)
运行'git checkout - '获取所有文件.
使它工作的关键是添加/*文件夹的名称后.
我有git 1.9
2020 年更新答案:
现在有一个命令git sparse-checkout,我在Git 2.25(2020 年第一季度)中详细介绍了该命令
git sparse-checkout init --cone # to fetch only root files
git sparse-checkout add apps/my_app
git sparse-checkout add libs/my_lib
Run Code Online (Sandbox Code Playgroud)
它随 Git 2.27 一起发展,并且知道如何“重新应用”稀疏结帐,如下所示。
请注意,在 Git 2.28 中,git status会提到您在稀疏签出的存储库中
原答案:2016
git 2.9(2016 年 6 月)将--no-checkout选项概括为git worktree add(该命令允许为一个 repo使用多个工作树)
请参阅Ray Zhang ( ) 的commit ef2a0ac(2016 年 3 月 29 日)。
帮助者:Eric Sunshine ( )和Junio C Hamano ( )。(由Junio C Hamano合并-- --在commit 0d8683c,2016 年 4 月 13 日)OneRaynyDaysunshinecogitster
gitster
该git worktree手册页现在包括:
--[no-]checkout:
Run Code Online (Sandbox Code Playgroud)
默认情况下,
add检查出来<branch>,但--no-checkout可以用来抑制结账为了使自定义,如配置稀疏结帐。
适用于 git 2.28
git clone --filter=blob:none --no-checkout --depth 1 --sparse <project-url>
cd <project>
git sparse-checkout init --cone
Run Code Online (Sandbox Code Playgroud)
指定要克隆的文件和文件夹
git sparse-checkout add <folder>/<innerfolder> <folder2>/<innerfolder2>
git checkout
Run Code Online (Sandbox Code Playgroud)
是的,可以下载文件夹而不是下载整个存储库。甚至任何/最后一次提交
做到这一点的好方法
D:\Lab>git svn clone https://github.com/Qamar4P/LolAdapter.git/trunk/lol-adapter -r HEAD
Run Code Online (Sandbox Code Playgroud)
-r HEAD将仅下载最新修订版,忽略所有历史记录。
注意行李箱和/特定文件夹
在之前和之后复制和更改URL /trunk/。我希望这会对某人有所帮助。请享用 :)
于2019年9月26日更新
小智 6
稀疏结帐仅特定文件夹的步骤:
1) git clone --no-checkout <project clone url>
2) cd <project folder>
3) git config core.sparsecheckout true [You must do this]
4) echo "<path you want to sparce>/*" > .git/info/sparse-checkout
[You must enter /* at the end of the path such that it will take all contents of that folder]
5) git checkout <branch name> [Ex: master]
Run Code Online (Sandbox Code Playgroud)
基于此答案由apenwarr与此评论被Miral我想出了以下解决方案克隆时救了我近94%的磁盘空间的linux git仓库在本地,而只想要一个文档子目录:
$ cd linux
$ du -sh .git .
2.1G .git
894M .
$ du -sh
2.9G .
$ mkdir ../linux-sparse-test
$ cd ../linux-sparse-test
$ git init
Initialized empty Git repository in /…/linux-sparse-test/.git/
$ git config core.sparseCheckout true
$ git remote add origin ../linux
# Parameter "origin master" saves a tiny bit if there are other branches
$ git fetch --depth=1 origin master
remote: Enumerating objects: 65839, done.
remote: Counting objects: 100% (65839/65839), done.
remote: Compressing objects: 100% (61140/61140), done.
remote: Total 65839 (delta 6202), reused 22590 (delta 3703)
Receiving objects: 100% (65839/65839), 173.09 MiB | 10.05 MiB/s, done.
Resolving deltas: 100% (6202/6202), done.
From ../linux
* branch master -> FETCH_HEAD
* [new branch] master -> origin/master
$ echo "Documentation/hid/*" > .git/info/sparse-checkout
$ git checkout master
Branch 'master' set up to track remote branch 'master' from 'origin'.
Already on 'master'
$ ls -l
total 4
drwxr-xr-x 3 abe abe 4096 May 3 14:12 Documentation/
$ du -sh .git .
181M .git
100K .
$ du -sh
182M .
Run Code Online (Sandbox Code Playgroud)
所以我从 2.9GB 降到了 182MB,这已经很安静了。
我虽然没有让它与git clone --depth 1 --no-checkout --filter=blob:none file:///…/linux linux-sparse-test(此处提示)一起使用,因为然后丢失的文件都作为已删除的文件添加到索引中。所以如果有人知道git clone --filter=blob:nonefor的等价物git fetch,我们可能可以节省更多的兆字节。(阅读手册页git-rev-list也暗示有类似的东西--filter=sparse:path=…,但我也没有让它起作用。
(所有尝试都使用来自 Debian Buster 的 git 2.20.1。)
在 git 2.27 中,git稀疏结帐看起来已经进化了。这个答案中的解决方案的工作方式并不完全相同(与 git 2.25 相比)
Run Code Online (Sandbox Code Playgroud)git clone <URL> --no-checkout <directory> cd <directory> git sparse-checkout init --cone # to fetch only root files git sparse-checkout set apps/my_app libs/my_lib # etc, to list sub-folders to checkout # they are checked out immediately after this command, no need to run git pull
这些命令效果更好:
git clone --sparse <URL> <directory>
cd <directory>
git sparse-checkout init --cone # to fetch only root files
git sparse-checkout add apps/my_app
git sparse-checkout add libs/my_lib
Run Code Online (Sandbox Code Playgroud)
另请参阅:git-clone --sparse和git-sparse-checkout add
| 归档时间: |
|
| 查看次数: |
112078 次 |
| 最近记录: |