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.txt
和 a/d/e/h.readme
.
您的计算机可能需要通过创建一个名为 a
的目录(或文件夹),然后在 a
中创建一个名为 d
的目录(或文件夹),依此类推。 Git 会那样做。如果要使用 git checkout
提取这些文件,则不能让 Git 使用任何其他名称。1
因此,您可以选择 而不是 使用 git checkout
来获取这些文件。例如,您可以获得提交(就像您已经在做的那样),然后在各个路径名上使用 git show
。 git show
的标准输出将显示文件的内容;您可以将其重定向到您选择的文件名。
由于您不想要整个存储库,请考虑使用 git archive
将 一个 提交转换为存档。由于您也不想要整个提交,请考虑在此 git archive
命令中添加您要归档的文件的名称。2 您可能然后有一个 un-archiver 可以 skip 每个归档文件路径名的 a/d/
部分。例如,GNU tar 有 --strip-components
.
1我认为能够将存储的文件名重新映射到文件系统内的名称会很好,原因有很多,包括大小写折叠问题和厚脸皮Linux 个程序员创建了名为 CON
和 LPT
的文件。 :-) 但是 Git 不能,至少今天不能。
2这不是 必需的,如果您从托管服务器下载这种 git archive
例如 GitHub,你可能做不到。但是,如果您 可以 这样做,您将节省一些 space 和传输时间。例如,给定您的 ssh://user@host
URL,您可能可以 运行 ssh user@host "cd path/to/repo; git archive ..."
并将结果通过管道传输到本地 tar -xf -
。
这是我的 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.txt
和 a/d/e/h.readme
.
您的计算机可能需要通过创建一个名为 a
的目录(或文件夹),然后在 a
中创建一个名为 d
的目录(或文件夹),依此类推。 Git 会那样做。如果要使用 git checkout
提取这些文件,则不能让 Git 使用任何其他名称。1
因此,您可以选择 而不是 使用 git checkout
来获取这些文件。例如,您可以获得提交(就像您已经在做的那样),然后在各个路径名上使用 git show
。 git show
的标准输出将显示文件的内容;您可以将其重定向到您选择的文件名。
由于您不想要整个存储库,请考虑使用 git archive
将 一个 提交转换为存档。由于您也不想要整个提交,请考虑在此 git archive
命令中添加您要归档的文件的名称。2 您可能然后有一个 un-archiver 可以 skip 每个归档文件路径名的 a/d/
部分。例如,GNU tar 有 --strip-components
.
1我认为能够将存储的文件名重新映射到文件系统内的名称会很好,原因有很多,包括大小写折叠问题和厚脸皮Linux 个程序员创建了名为 CON
和 LPT
的文件。 :-) 但是 Git 不能,至少今天不能。
2这不是 必需的,如果您从托管服务器下载这种 git archive
例如 GitHub,你可能做不到。但是,如果您 可以 这样做,您将节省一些 space 和传输时间。例如,给定您的 ssh://user@host
URL,您可能可以 运行 ssh user@host "cd path/to/repo; git archive ..."
并将结果通过管道传输到本地 tar -xf -
。