Git 拉取所有引用远程仓库中与我的本地仓库无关的单个文件的提交

Git pull all commits referring to a single file in remote repo unrelated to my local repo

我想通过 Git pull this file(到目前为止有 3 次提交)进入我自己的本地存储库,这与 Git Hub 回购协议。是否有可能以某种方式 pull 所有与该特定文件相关的提交?

换句话说,是否可以下载位于任意存储库中的任何文件(意思是与之相关的提交)——这是未在我的存储库中添加为遥控器,也未克隆 - 我有权访问?

如果我理解 Git 正确 - 我可以 pull 通过首先 fetch'ing 从远程分支更改为本地分支,但我的回购必须添加这样的回购分支作为远程。如果是这样,是否就像添加新的远程仓库和 pulling 特定分支一样简单(甚至 cherry-pick 只需要提交),而这应该只是在我的本地仓库中创建新分支,所有或选择(cherry-picked)提交?

最好的办法是签出单个文件并提交每个修订版。

git remote add new_repo PATH_TO_REPO.git
git fetch new_repo
git checkout <SHA> -- my_file.txt
git add my_file.txt

对每个提交重复

git pull 并不是真正对 文件 进行操作,而是对 提交 进行操作。 git pull 所做的只是 运行 git fetch,然后是 运行 git merge 或您选择的其他第二个 Git 命令。 fetch 步骤获取提交,而 merge 步骤——你可能 不想 想要——将这些提交与你当前的 (HEAD)提交和分支。

你在此处括号部分的想法肯定是正确的:

In other words is it possible to download ... (... commits related to some specific file) ...

技巧是:

  1. 找到那些提交(您已经使用 GitHub 来实现);
  2. 但一旦找到并获得它们,就会实际使用它们。

您只能获得整个提交,或者什么都没有;如果你得到一个完整的提交,你也会得到 导致 那一次提交的所有提交。 app-ideas repository(你想要的文件出现在其中)包含,在我写这篇文章的那一刻,并且只使用来自 GitHub 的信息,实际上没有仔细观察,332 次提交。它还显示五个分支名称。

可以将所有 332 个提交添加到您的存储库,或者在某些情况下(但不是这个)所有 332 个提交的某些子集,而无需使用远程名称:

git fetch https://github.com/florinpop17/app-ideas <refspec> [<refspec> ...]

将引入由 refspec 参数标识的提交,并记住它通过 FETCH_HEADrefspec 参数。但是:

git remote add app-ideas https://github.com/florinpop17/app-ideas
git fetch app-ideas

更方便因为它也是一样的,然后添加五个remote-tracking名称对应五个分支名称。例如,您现在将有一个 name app-ideas/master。它确实需要更多的预先输入,但它可以节省您以后的工作,最终您只需 运行 git remote remove app-ideas 当您完成它时。

要在没有遥控器的情况下执行此操作,例如:

git fetch https://github.com/florinpop17/app-ideas master:tempbranch

创建您自己的名为 tempbranch 的分支,而不是使用 app-ideas/master。您甚至可以创建 no 分支并仅依赖 FETCH_HEAD,但是您必须记住 next git fetch你 运行——或者 git pull 运行——将把它擦掉,这 332 次提交中的部分或全部可能会从你自己的存储库中消失。您最终可能还是想删除 tempbranch,所以您并没有真正节省多少。

无论如何,在获取之后,您的存储库中就有了所有 322 次提交。这些提交相互关联,但与存储库中的任何 other 提交无关。在图论术语中,它们的提交,由您的 app-ideas/mastertempbranch 命名和发现,从您自己的所有提交、命名和发现中形成一个 不相交的子图 通过您自己的分支名称。

此时,您可以使用 Git 的各种其他操作,包括 git cherry-pick 或(如 git checkout,以处理来自他们的提交,并将其添加到您的(仍然独立的)提交中。完成后,删除远程名称或 tempbranch 名称,无论您使用哪种方法。他们的提交将变得无法找到,最终会从您的存储库中退回。