【问题标题】:Git pull all commits referring to a single file in remote repo unrelated to my local repoGit 拉取所有引用远程仓库中与我的本地仓库无关的单个文件的提交
【发布时间】:2019-08-07 19:30:56
【问题描述】:

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

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

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

【问题讨论】:

    标签: git file pull any remote-repository


    【解决方案1】:

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

    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 fetch(或使用-f选项自动完成)。
    • 我不必为每次提交重复git add,因为一旦在我的仓库中创建了文件,随后的git checkout 一直在修改已经存在的文件,所以我只需要提交我的仓库的新版本。
    【解决方案2】:

    git pull 并不真正在 files 上运行,而是在 commits 上运行。所有git pull 所做的只是运行git fetch,然后运行git merge 或您选择的其他第二个Git 命令。 fetch 步骤获取提交,merge 步骤(您可能想要)将这些提交与您当前的 (HEAD) 提交和分支合并。

    您在此处的括号部分肯定有正确的想法:

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

    诀窍是:

    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 或(如 EncryptedWatermelon's answergit checkout,处理来自他们提交的内容,并将其添加到您的(仍然独立的)提交中。完成后,删除远程名称或tempbranch 名称,无论您使用哪种方法。他们的提交将变得无法找到,并最终会退出您的存储库。

    【讨论】:

    • 感谢您的详细解释。然而,EncryptedWatermelon 的答案更容易应用。
    猜你喜欢
    • 1970-01-01
    • 2011-08-09
    • 2017-06-17
    • 1970-01-01
    • 2019-06-22
    • 2018-12-05
    • 2017-09-30
    • 2012-06-26
    • 2013-09-25
    相关资源
    最近更新 更多