ChatGPT解决这个技术问题 Extra ChatGPT

Git:如何从远程源主机更新/签出单个文件?

场景:

我在本地对单个文件进行了一些更改并运行 git add、git commit 和 git push 文件被推送到远程源主存储库我有另一个本地存储库,它通过 Capistrano 使用远程存储库中的“remote_cache”方法部署现在我不想部署整个应用程序,而只是更新/签出该单个文件。

这对git有可能吗?我找不到任何可行的方法,也无法弄清楚。使用 SVN,我只是做了 svn up file,瞧。

您可能需要考虑将接受的答案更改为实际回答您问题的答案。 ;)
6年多之后,我相信我们可以放心地假设这不会发生@steps ...
对于 Git 2.23(2019 年 8 月),它是 git restore -s origin/master -- path/to/file。请参阅my answer below

J
JMM

可以做(在部署的存储库中)

git fetch
git checkout origin/master -- path/to/file

提取将下载所有最近的更改,但不会将其放入您当前签出的代码(工作区)中。

检出将使用下载的更改 (origin/master) 中的特定文件更新工作树。

至少这对我来说适用于那些小的错字修复,在那里创建分支等只是为了更改文件中的一个单词感觉很奇怪。


超级好用,效果很好。在更新生产中的站点的其余部分之前,我需要获取一个 composer.json 文件并运行更新。如果我手动将 composer.json/lock 文件放在适当的位置,当我拉动时,它会冲突说文件已经存在。通过这样做,git 毫无怨言地识别了这些文件。
这是我一直在寻找的答案。
@Mymozaaa 双破折号表示后面是文件名。这是为了防止 git 在你有两个同名的不幸情况下将你的文件名解释为一个分支。
问题是您仍在获取,如果它是一个大型回购,那将是昂贵的操作。我担心唯一的选择是在遥控器上安装 gitweb 然后访问它以检索文件等。
如果要检出文件夹中的所有文件,只需执行 git checkout origin/master -- path/to/folder/*(注意末尾的 *)。
v
vsync

以下代码对我有用:

git fetch
git checkout <branch from which file needs to be fetched> <filepath> 

git fetch <remote>; git checkout <remote>/<branch> -- <file> 用于非来源遥控器
V
VonC

使用 Git 2.23(2019 年 8 月)和新的(仍处于试验阶段)命令 git restore(在“How to reset all files from working directory but not from staging area?”中可见),将是:

git fetch
git restore -s origin/master -- path/to/file

这个想法是:git restore 只处理文件,而不像 git checkout 那样处理文件分支。
请参阅“Confused by git checkout”:这就是 git switch进来)

codersam 添加 in the comments

就我而言,我想从上游(我从中分叉)获取数据。所以就改成: git restore -s upstream/master -- path/to/file


这条命令终于存在了,真是令人欣慰…… git-cluefull 人以前在做什么?我正在恢复整个事情并复制我需要的单个文件,但这很痛苦。
这对我有用,但就我而言,我想从上游(我从中分叉)获取数据。所以就改成git restore -s upstream/master -- path/to/file
@coderSam 比你这个反馈。我已将您的评论包含在答案中以提高知名度。
restore 在我的测试中更好,因为它把文件放在工作区而不是像 checkout 那样的暂存区。
D
Dmitry R
git archive --format=zip --remote=ssh://<user>@<host>/repos/<repo name> <tag or HEAD> <filename> > <output file name>.zip

对于通过 ssh 克隆的 repos,这是一个很好的解决方案,但似乎这不受 https 支持:git archive --remote=https://github.com/git/git.git master:git/contrib/completion git-completion.bash | tar -x 给我错误消息:fatal: Operation not supported by protocol.
tar:s --to-stdoutgit archive --remote="gitolite3@<host>:<repo>" <tag> <file> | tar xf - --to-stdout 结合使用很好
M
Mathivanan

简直对我有用

git checkout origin/develop file_name.php

j
jag

你可以做的是:

更新本地 git repo: git fetch 构建本地分支并在其上结帐: git branch pouet && git checkout pouet 在此分支上应用您想要的提交: git cherry-pick abcdefabcdef (abcdefabcdef 是您要应用的提交的 sha1 )


顺便说一句,您的第二步也可以在一个命令中完成,例如 git checkout -b pouet
'pouet' 是此示例的最佳分支名称。
j
jahrichie

或者在你所在的分支上 git stash(如果你有更改),结帐 master,拉取最新的更改,将该文件抓取到你的桌面(或整个应用程序)。检查您所在的分支。 Git stash 应用回您所处的状态,然后手动修复更改或将其拖动以替换文件。

这种方式不是很酷,但如果你们想不出其他任何东西,它就可以正常工作。


B
BillowJiang

我给你的中文步骤很烂,我给你的步骤是:

git checkout master
git pull --rebase
git checkout dev
git checkout master ./app/file.py

机器翻译:如果是在dev分支中开发,替换文件后合并master分支并push。例如,替换 app/file.py。


我的英文真的很烂,希望你能看到.... 都是机器翻译的。
正如目前所写的那样,您的答案尚不清楚。请edit添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。您可以找到有关如何写出好答案的更多信息in the help center
V
Viswadeep Sarangi

我想我找到了一个简单的破解方法。

删除本地存储库中的文件(要从远程服务器中的最新提交更新的文件)

然后执行 git pull

因为文件被删除了,所以不会有冲突


这将在本地删除对该文件所做的所有最终更改,并提取所有其他文件,这正是 OP 不想做的。
而不是更新远程分支,删除本地是非常糟糕的主意。