0

我想通过 Git 将pull 这个文件(到目前为止有 3 个提交)放入我自己的本地存储库中,这与该 GitHub 存储库完全无关。是否有可能以某种方式pull与该特定文件相关的所有提交?

换句话说,是否可以下载位于任意存储库中的任何文件(意味着与它相关的提交) ——它既没有作为远程添加到我的仓库中也没有克隆——我可以访问?

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

4

2 回答 2

2

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

您在这里的括号部分肯定有正确的想法:

换句话说,是否可以下载......(......与某些特定文件相关的提交)......

诀窍是:

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

您只能获得整个提交,或者什么都没有;如果你得到一个完整的提交,你也会得到导致那个提交的所有提交。app-ideas 存储库(您想要的文件出现在其中)包含,在我写这篇文章的那一刻,并且只使用来自 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

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

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

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

创建自己的名为 的分支tempbranch,而不是使用app-ideas/master. 您甚至可以创建分支而只依赖 . FETCH_HEAD,但是您必须记住,下一次 git fetch运行(或已经git pull运行)会将其清除,并且这 332 次提交中的部分或全部可能会从您自己的存储库中消失。可能你最终还是会想要删除tempbranch,所以如果有的话,你并没有真正节省太多。

在任何情况下,获取后,您的存储库中都有所有 322 次提交。这些提交相互关联,但与存储库中的任何其他提交无关。在图论术语中,它们的提交,由你的app-ideas/masteror命名和发现,与你自己的所有提交tempbranch形成一个不相交的子图,由你自己的分支名称命名和发现。

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

于 2019-08-07T21:47:00.113 回答
2

最好的办法是检查单个文件并提交每个 rev。

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

对每个提交重复

于 2019-08-07T19:56:43.830 回答