首页 > 解决方案 > git 稀疏结帐(文件夹)有问题

问题描述

这是我的 git 服务器树:

----a/
    |--b/
    |--c/
    |--d/
       |--e/
          |--f/
             |--g.txt
          |--h.readme

这是我的 git 版本树

---------------->master
    |---->myBranch [files are up to date here]

这是我的詹金斯服务器树

-----A/
     |--B/
     |--C/

我正在尝试检查存储库“B”中存储库“e”的内容我只需要我正在处理的当前分支的最后一个版本,我不想提交,只是为了获得一些最新信息要运行的日期只读脚本,所以depth 1我猜是可以的。

无论如何,我面临的问题是我能够进行稀疏结帐

#############################
#####    1/ configuring local folder
#############################
git init
git config core.sparseCheckout true
#an empty repository with the remote is created:
git remote add -f origin ssh://guillaumedg@domain.com:port/myProjects/thisProject.git
#add repository "e" to be checked out:
echo e/*> .git/info/sparse-checkout
#############################
#####    2/ fetching/updating files
#############################
git fetch 
git checkout myBranch

我知道我很接近,但我得到的是:

-----A/
     |--B/
     |  |----a/
     |       |--d/
     |          |--e/
     |             |--f/
     |                |--g.txt
     |             |--h.readme
     |--C/

不是这个(这是我想要的)

-----A/
     |--B/
     |  |--f/
     |     |--g.txt
     |  |--h.readme
     |--C/

任何提示?

顺便说一句,我尝试了将“深度 1”用于“步骤 2”的不同方法,但没有成功:

git fetch --depth 1 $(url) $(branch)
git checkout $(branch)

--> 错误:pathspec 'myBranch' 与 git 已知的任何文件都不匹配。

git fetch --depth 1 $(url) $(branch)
git checkout 

--> 致命的:你在一个尚未出生的分支上

git fetch --depth 1 $(url) $(branch)
git checkout -b $(branch) 

致命:一个名为“myBranch”的分支已经存在。

git fetch
git checkout $(branch)

--> 如上所述工作

标签: bashgitsparse-checkout

解决方案


Git 不存储目录,只存储文件。因此,鉴于您的图纸:

----a/
    |--b/
    |--c/
    |--d/
       |--e/
          |--f/
             |--g.txt
          |--h.readme

存储库有一些提交,其文件名为:

a/d/e/f/g.txt

和:

a/d/e/h.readme

您可以使用命令行选项或您尝试使用的稀疏检出选项指示您的 Git 检出这些特定文件。他们的名字仍然是a/d/e/f/g.txtand a/d/e/h.readme

您的计算机可能需要通过创建一个名为 的目录(或文件夹)来创建这些名称a,然后创建一个名为din的目录a,依此类推。Git 会这样做。如果您要使用git checkout它们来提取这些文件,则不能让 Git 为这些文件使用任何其他名称。1

因此,您可以选择使用git checkout来获取这些文件。例如,您可以获得提交(正如您已经在做的那样),然后git show在单个路径名上使用。的标准输出git show将显示文件的内容;您可以将其重定向到您选择的文件名。

由于您不想要整个存储库,请考虑使用git archive一个提交转换为存档。由于您也不想要整个提交,请考虑在此git archive命令中添加您要归档的文件的名称。2 然后,您可能有一个取消归档程序,它可以跳过每个归档文件的a/d/部分路径名。例如,GNU tar 有--strip-components.


1我认为能够将存储的文件名重新映射到文件系统内的名称会很好,原因有很多,包括大小写折叠问题和厚脸皮的 Linux 程序员创建名为CONLPT. :-) 但是 Git 不能,至少今天不能。

2这不是必需的,如果您git archive从 GitHub 等托管服务器下载此类,您可能无法执行此操作。但如果你做到这一点,你将节省一些空间和传输时间。例如,给定您的ssh://user@hostURL,您可能可以运行ssh user@host "cd path/to/repo; git archive ..."并将结果通过管道传输到本地tar -xf -


推荐阅读