ChatGPT解决这个技术问题 Extra ChatGPT

如何使用 git 拉取特定目录

我有一个带有 git 的项目,我只想克隆或提取一个特定的目录,比如 myproject/javascript,就像 subversion 一样。进行一些更改,提交并再次推回。这是可能的?

稀疏结帐可能会让您感兴趣(即使您仍然需要获取所有内容):请参阅 stackoverflow.com/questions/2416815/…
“克隆”和“拉取”是 git 中的两种不同操作。这个问题涉及到这两个问题,并且您已经为每个问题得到了一些答案,但并不总是很清楚每个答案旨在解决哪一个问题。这令人困惑。

A
Alan Mick

cd 进入您的仓库副本的顶部 git fetch git checkout HEAD path/to/your/dir/or/file 其中(3)中的“path/...”从包含您的“.. ./file” 请注意,可以使用特定提交的哈希码代替“HEAD”,然后您将获得特定于该提交的修订版(文件)或修订版(目录)。


才意识到我误解了这个问题。相反,我的回复解决了如何签出单个文件,然后可以对其进行修改和提交。
您解决了问题的标题,这已经足够好了。这只是救了我,就我而言,这是正确的答案 - 特别是因为这是谷歌在这个问题上的热门话题。
尽管如此,这仍然可以获得整个回购。对于 2GB 大小的项目,这并不能节省太多时间。
对于那些阅读了这些评论并且不知道这不能回答问题的人,此解决方案所做的只是为您提供该文件夹的副本,但它不是工作副本,这意味着您无法修改和重新-犯罪。所以正如@Morgon 所说,它解决了问题的标题(你只能拉一个目录),但没有回答问题的主体(“进行一些更改,提交并再次推回”)。
@StanHolodnak -- 虽然不是必需的。它强制将其后的位解释为路径。所以,是的,如果您有一个名称为 --help 的文件要签出,则需要在其前面加上这些连字符:git checkout HEAD -- --help
r
rolve

在一个空目录中:

git init
git remote add [REMOTE_NAME] [GIT_URL]
git fetch REMOTE_NAME
git checkout REMOTE_NAME/BRANCH -- path/to/directory

如果您只想使用文件的远程版本来替换本地文件,这可行,我认为
这也拉文件夹,如何不下载文件夹,而只下载文件夹内的东西?
不需要 fetchcheckout 命令,我们只需在 remote add 命令之后发出拉取请求即可获得整个 master 分支。
正如 Pithkos 在接受的答案中指出的那样,此答案还将整个远程存储库下载到您的本地计算机。 shingara 的回答是最明确的——没有办法远程提取回购的一部分。但是,对于那些不介意整个获取的带宽并且有兴趣制作本地缓存的一部分的工作副本的人,那么接受的答案会告诉您如何做。但我只是想明确一点,必须将 repo 的整个历史记录(以压缩格式)下载到您的机器上。
请注意,此解决方案将丢失您的提交历史记录
C
Community

经过多次寻找答案,没有找到,放弃,再次尝试等等,我终于在另一个 SO 线程中找到了解决方案:

How to git-pull all but one folder

要复制粘贴那里的内容:

git init
git remote add -f origin <url>
git config core.sparsecheckout true
echo <dir1>/ >> .git/info/sparse-checkout
echo <dir2>/ >> .git/info/sparse-checkout
echo <dir3>/ >> .git/info/sparse-checkout
git pull origin master

要执行 OP 想要的操作(仅处理一个目录),只需在执行上述步骤时将该目录添加到 .git/info/sparse-checkout

非常感谢@cforbish!


我在这里发布它主要是因为每当我尝试用谷歌搜索如何做到这一点时,这是一个最佳结果,而且该线程甚至还没有接近显示。 :( 我觉得复制粘贴很糟糕,但我认为这是最佳实践?
这是唯一一种干净的解决方案。尝试了上面的答案。在我用其他答案检查了我的分支后,我无法拉取,并且有几个需要提交的新文件。有了这个解决方案,一切看起来都很好。但请注意:无论签出哪个分支,git 都会认为您在 master 中。只需确保您执行 git branch --set-upstream-to=origin/<branch> 以正确拉动
f
feralamillo

如果您想在不输入目录的情况下获取目录中的最新更改,您可以执行以下操作:

$ git -C <Path to directory> pull

K
Kheldar

也许这个命令会有所帮助:

git archive --remote=MyRemoteGitRepo --format=tar BranchName_or_commit  path/to/your/dir/or/file > files.tar

“等等瞧”


这会下载特定目录的文件以进行归档,这不会拉取您可以修改和推回的副本。
很酷。作为 OP 的解决方案可能不可接受,但它实际上是我所追求的,因为我只需要在一个更大的 repo 中搜索一个大文件夹的内容,我绝对不想获取,我不需要修改/推。
正如@leetNightshade 所说,这不是回答这个问题的正确方法。
s
shingara

这是不可能的。您需要拉所有存储库或什么都没有。


即使您需要 fetch 一切,在这种情况下是否会对稀疏结帐工作树感兴趣?请参阅stackoverflow.com/questions/2416815/…
补充一点,你不能只拉一个目录的原因是因为 git 使用数据语义跟踪,而不是文件语义跟踪,所以你可以无缝地将代码(或其他数据)移入和移出文件,而无需告诉源跟踪系统(当然,直到您更新为止。)因此,代码也可以无缝地移入和移出目录,因此仅抓取一个目录没有多大意义。希望这可以帮助。
@OmnipotentEntity 对不起,但恕我直言,它确实有道理。实施不应限制使用。 Git 确实知道目录是什么(至少在创建本地工作副本时),因此它没有理由不能在服务器上执行一些类似的操作并只发送相关输出。当然,这目前还没有实现,但这是由于缺乏功能,而不是根本不可能。就我个人而言,我认为这是一个非常重要的功能,但是嘿,这是我尽可能避免使用 git 的原因之一。
C
Ciro Santilli Путлер Капут 六四事

来自 git 2.19 的git clone --filter现在可以在 GitHub 上运行(测试于 2020 年 9 月 18 日,git 2.25.1)

我不确定拉/取,但至少对于初始克隆,此选项是与远程协议的更新一起添加的,它确实可以防止从服务器下载对象。

例如,仅克隆此存储库的 d1 所需的对象:https://github.com/cirosantilli/test-git-partial-clone 我可以这样做:

git clone \
  --depth 1 \
  --filter=blob:none \
  --no-checkout \
  https://github.com/cirosantilli/test-git-partial-clone \
;
cd test-git-partial-clone
git checkout master -- d1

我在以下位置对此进行了更详细的介绍:Git: How do I clone a subdirectory only of a Git repository?

很可能在该区域中为 git clone 实现的任何东西也将具有 git pull 类似物,但我还不能很容易地找到它。


N
Nnaik

尝试并测试了这个作品!

mkdir <directory name> ;  //Same directory name as the one you want to pull
cd <directory name>;
git remote add origin <GIT_URL>;
git checkout -b '<branch name>';
git config core.sparsecheckout true;
echo <directory name>/ >> .git/info/sparse-checkout;
git pull origin <pull branch name>

希望这有帮助!


D
D M

对于所有像我一样在理论文件路径和示例方面遇到的困难,这里有一个真实的示例:Microsoft 在 git hub 上提供了他们的文档和示例,不幸的是,他们确实在这个存储库中收集了大量主题的所有示例文件:

https://github.com/microsoftarchive/msdn-code-gallery-community-s-z

我只对路径中的 Microsoft Dynamics js 文件感兴趣

msdn-code-gallery-community-s-z/Sdk.Soap.js/

所以我做了以下

创建一个

msdn-code-gallery-community-s-zSdkSoapjs\.git\info\sparse-checkout

磁盘上我的存储库文件夹中的文件

git sparse-checkout init

在该目录中使用 Windows 上的 cmd

的文件内容

msdn-code-gallery-community-s-zSdkSoapjs\.git\info\sparse-checkout

Sdk.Soap.js/*

最后做一个

git pull origin master

A
Abizern

有时,您只想查看以前的文件副本,而无需经历差异。

在这种情况下,克隆存储库并签出您感兴趣的特定提交并查看该克隆存储库中的子目录同样容易。因为一切都是本地的,所以你可以在完成后删除这个克隆。