【问题标题】:Git: How to update/checkout a single file from remote origin master?Git:如何从远程源主机更新/签出单个文件?
【发布时间】:2011-03-21 01:17:10
【问题描述】:

场景:

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

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

【问题讨论】:

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

标签: git git-checkout


【解决方案1】:

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

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/*(注意末尾的*)。
【解决方案2】:

以下代码对我有用:

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

【讨论】:

  • git fetch &lt;remote&gt;; git checkout &lt;remote&gt;/&lt;branch&gt; -- &lt;file&gt; 用于非原始遥控器
【解决方案3】:

使用 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 那样的暂存区。
【解决方案4】:
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-stdout, git archive --remote="gitolite3@&lt;host&gt;:&lt;repo&gt;" &lt;tag&gt; &lt;file&gt; | tar xf - --to-stdout 结合使用效果很好
【解决方案5】:

你可以做的是:

  1. 更新您的本地 git 存储库:

    git fetch

  2. 建立一个本地分支并在其上结帐:

    git branch pouet &amp;&amp; git checkout pouet

  3. 在这个分支上应用你想要的提交:

    git cherry-pick abcdefabcdef

    (abcdefabcdef 是您要应用的提交的 sha1)

【讨论】:

  • 顺便说一句,您的第二步也可以在一个命令中完成,例如git checkout -b pouet
  • 'pouet' 是本示例的最佳分支名称。
【解决方案6】:

它对我有用

git checkout origin/develop file_name.php

【讨论】:

    【解决方案7】:

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

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

    【讨论】:

      【解决方案8】:

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

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

      然后做一个git pull

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

      【讨论】:

      • 这会在本地删除对该文件所做的所有最终更改,并提取所有其他文件,这正是 OP 不想做的事情。
      • 与其更新远程分支,不如删除本地分支。
      猜你喜欢
      • 2022-01-11
      • 1970-01-01
      • 2017-06-21
      • 2015-09-26
      • 2015-03-10
      • 1970-01-01
      • 1970-01-01
      • 2010-12-19
      相关资源
      最近更新 更多