【问题标题】:having trouble with a git sparse checkout (folder)git 稀疏结帐(文件夹)有问题
【发布时间】:2019-12-13 13:36:25
【问题描述】:

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

--> 如上所述工作

【问题讨论】:

    标签: bash git sparse-checkout


    【解决方案1】:

    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-可以跳过每个归档文件路径名的a/d/ 部分的归档程序。例如,GNU tar 有--strip-components


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

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

    【讨论】:

      猜你喜欢
      • 2017-06-07
      • 2020-11-23
      • 2019-11-19
      • 2012-03-23
      • 1970-01-01
      • 2017-08-31
      • 2023-03-24
      • 2016-06-18
      • 2016-05-07
      相关资源
      最近更新 更多