在Git 1.7.0中稀疏结账?

dav*_*avr 68 git version-control sparse-checkout

使用Git 1.7.0中新的稀疏结账功能,是否可以像在SVN中一样获取子目录的内容?我找到了这个例子,但它保留了完整的目录结构.想象一下,我只想要'perl'目录的内容,而没有名为'perl'的实际目录.

- 编辑 -

例:

我的git存储库包含以下路径

repo/.git/
repo/perl/
repo/perl/script1.pl
repo/perl/script2.pl
repo/images/
repo/images/image1.jpg
repo/images/image2.jpg
repo/doc/
repo/doc/readme.txt
repo/doc/help.txt
Run Code Online (Sandbox Code Playgroud)

我想要的是能够从上面的存储库中生成这种布局:

repo/.git/
repo/script1.pl
repo/script2.pl
Run Code Online (Sandbox Code Playgroud)

然而,使用当前的稀疏结账功能,似乎只能获得

repo/.git/
repo/perl/script1.pl
repo/perl/script2.pl
Run Code Online (Sandbox Code Playgroud)

这不是我想要的.

ric*_*chq 26

您仍然需要克隆整个存储库,该存储库将包含所有文件.您可以使用该--depth标志仅检索有限数量的历史记录.

克隆存储库后,读取树技巧会将存储库的"视图"限制为仅包含文件中的文件或目录.git/info/sparse-checkout.

我写了一个快速脚本来帮助管理稀疏性,因为此刻它有点不友好:

#!/bin/sh
echo > .git/info/sparse-checkout
for i in "$@"
do
    echo "$i" >> .git/info/sparse-checkout
done
git read-tree -m -u HEAD
Run Code Online (Sandbox Code Playgroud)

如果将此脚本保存git-sparse.sh到通过调用报告的路径中git --exec-path,则可以git sparse foo/ bar/仅运行"检出"foo和bar目录,或者git sparse '*'重新获取所有内容.

  • 是的,稀疏只是一种过滤实际树的方法,它不能移动文件.所以你不能做你想要的...... (3认同)

Joh*_*n K 16

最简洁的答案是不.Git将所有文件视为一个单元.

我建议您将存储库分解为逻辑块.perl,images和docs的单独一个.如果您还需要维护uber repo样式,则可以创建由子模块组成的repo .


小智 7

richq的答案很接近,但它错过了一步.您需要显式启用稀疏结帐:

git config core.sparsecheckout是的

此博客文章清楚地概述了所有步骤:

http://blog.quilitz.de/2010/03/checkout-sub-directories-in-git-sparse-checkouts/comment-page-1/#comment-3146


Ger*_*ish 5

现在没有详细说明为什么要这样做,你的问题可以(可能)通过符号链接/快捷方式轻松解决.

回答这个问题 - 不,并且有一个有意义的理由.即使使用"稀疏结账",也可以下载回购的整个历史记录.澄清为什么这是必要的 - 否则跟踪重命名的文件将是...颈部的痛苦.想象一下你将文件移动/repo_root/asd/file1.cpp/repo_root/fgh/file1.cpp- 现在如果你只下载了/repo_root/fgh增量,你将不会知道file1.cpp.所以这意味着你必须下载所有的增量.但是你有一个完整的存储库; 不仅仅是文件夹的剪切,因此只是/rero_root/fgh文件夹本身不是回购.当你结账时,这可能听起来不重要,但是当你提交时,git可能不知道工作正常.

解决方法:如果你真的想要,你可以创建一个以这种方式调用git-checkout的脚本(对于sh shell,不应该很难生成用于windows的批处理):

!/bin/sh
curDir=`pwd`
cd $2
git-checkout $1
cp -R $3/* $4
cd $curDir
Run Code Online (Sandbox Code Playgroud)

在这里,第一个参数是分支结账,第二个 - 其中回购是目前存在的第三文件夹 - 你想要的子目录真正使用,而第四 - 你希望它复制到该位置.

警告:我的shell技能几乎不存在,所以在测试后使用它.重新创建此脚本的反向并不难,复制回来的东西,以便它可以提交到repo.