git 稀疏结帐(文件夹)时遇到问题

having trouble with a git sparse checkout (folder)

这是我的 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/

有什么提示吗?

顺便说一句,我尝试了将 "depth 1" 用于 "step 2" 的不同方法,但没有成功:

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

--> error: pathspec 'myBranch' did not match any file(s) known to git.

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

--> fatal: You are on a branch yet to be born

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

fatal: A branch named 'myBranch' already exists.

git fetch
git checkout $(branch)

--> works as describe above

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.txta/d/e/h.readme.

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

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

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


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

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