Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Git获取单个提交_Git_Github - Fatal编程技术网

Git获取单个提交

Git获取单个提交,git,github,Git,Github,我想将远程存储库的一次提交(当然是有历史记录的)提取到本地存储库中。一些堆栈溢出响应表明以下操作应该可以正常工作,但实际情况并非如此: md foo cd foo git init git fetch https://github.com/ld4apps/lda-serverlib.git f1e32e18a90e10c150221af55c69aeafaa42c57a 这会产生以下错误: 错误:没有此类远程参考F1E32E18A90E10C150221AF55C69AEAA42C57A 令人

我想将远程存储库的一次提交(当然是有历史记录的)提取到本地存储库中。一些堆栈溢出响应表明以下操作应该可以正常工作,但实际情况并非如此:

md foo
cd foo
git init
git fetch https://github.com/ld4apps/lda-serverlib.git f1e32e18a90e10c150221af55c69aeafaa42c57a
这会产生以下错误:

错误:没有此类远程参考F1E32E18A90E10C150221AF55C69AEAA42C57A

令人惊讶的是(对我来说)以下几点确实起了作用:

这将创建一个新的本地分支,名为
f1e32e18a90e10c150221af55c69aeafaa42c57a
(这是我不想要的),但至少新分支具有我试图获取的内容。我可能期望下面的命令会做同样的事情,但它会得到与第一个示例相同的错误:

git fetch https://github.com/ld4apps/lda-serverlib.git f1e32e18a90e10c150221af55c69aeafaa42c57a:f1e32e18a90e10c150221af55c69aeafaa42c57a
我在Windows和Linux上用两个不同的git版本进行了尝试,发现了相同的行为

有人能解释一下这是怎么回事吗?关于Git、
fetch
和refspec,我不了解什么?我真正想要的是一个
git fetch
命令,我可以向它提供远程分支或标记的id或提交id,它将获取相应的提交。

更新:由于git 2.5(2015年年中左右),服务器现在可能会公开原始哈希。这是一个服务器端配置项。必须对服务器进行足够的控制才能设置它,并且在设置之前必须考虑潜在的安全问题。有关详细信息,请参阅。(原始答案,适用于2.5之前版本,或者如果未设置配置旋钮,请参见下文。)


git fetch
命令或多或少地将引用(名称,而不是原始提交ID)传递到远程。(更具体地说,使用
git ls remote remotename
查看遥控器愿意提供的名称。这会生成左侧的SHA-1列表,右侧有名称,您的
fetch
唯一可以要求的是右侧的名称。此时,如果遥控器上有名称,您将获得左侧的ID仍然指向该ID,因此这取决于远程设备更新的活跃程度。)

可以通过各种方式将原始提交ID发送到远程设备,并询问该远程设备从该点开始可以看到什么,有时也可以通过历史记录进行反向操作,但不能通过
git fetch
。(您可以使用
git archive
,但远程服务器可以决定是否允许您通过原始提交ID进行访问;或者对于具有web服务器访问权限(包括特定提交)的远程服务器,您通常只需查看提交的顶级内容,并使用该内容“向下搜索”,正如他们所说,这是一种非常缓慢的方法。)

如果您想使用
git-fetch
获得某些特定的提交,最简单的方法可能是让有权访问远程的人在提交ID上附加一个名字,很可能是一个标记。然后您可以让
git-fetch
将该refspec带过来,并将其放在您喜欢的任何其他refspec下。例如,假设您可以直接使用ssh连接到任何主机
源站

$ ssh our.origin.host 'cd /repos/repo.git; git tag temporary f1e32e1'
[enter password, etc; observe tag created]
$ git fetch origin refs/tags/temporary:refs/heads/newbranch
[observe fetch happen; now you have local branch 'newbranch']
$ ssh our.origin.host 'cd /repos/repo.git; git tag -d temporary'
请注意,名称不必是分支,它只需要是一个引用,您可以使用
git fetch
查看,然后使用
git ls remote
查看。然后,在获取时使用与refspec左侧匹配的名称。回购协议中创建的名称由refspec的右侧控制(
refs/heads/newbranch
,在上述示例中)

这也是您最后一段问题的答案:您只能命名在远程上有名称的东西(这部分是为了避免在垃圾收集之前“泄漏”存储库中保留的未命名提交,因此它被认为是一个特性,而不是一个bug)。这些名称位于refspec的左侧。你自己的名字在右边


右侧的名称被假定为分支或标记名称(基于左侧的名称匹配,尽管您可以显式拼写
refs/heads/
refs/tags/
以覆盖它),因此即使
f1e32e1…
是有效的SHA-1,在这里,它被视为一个分支名称,左边缺少的名称被翻译成
HEAD
,因为缺少的名称几乎总是这样,而
git fetch
创建了一个名称令人不安的分支。(顺便提一下,我曾经创建了一个看起来像SHA-1的分支名称,后来让我感到困惑。我完全忘记了名称是什么,比如没有连字符的
de bead
。我将其重命名为带连字符的版本,只是为了明确我不是指原始提交ID:-)

什么是“具有历史的单个提交”?其他提交是历史…我只是指通常的git行为,没有什么特别的。我想获取一个特定的提交,我知道git还将获取构成我指定的提交历史的提交。如果使用
git fetch--depth=1
(这确实有效,因为f1e32e18a90e10c150221af55c69aeafaa42c57a是您示例的当前提示,但这不是问题所在,是吗?).我不知道深度选项-谢谢你提供的信息。正如你所说,虽然很有趣,但这似乎与我的问题不相关。这不是一个重复的问题吗?谢谢,Torek,这很有帮助,似乎解释了我看到的大部分内容。我看不出它解释了为什么/如何
git fetch:f1e32e18a90e10c150221af55c69aeafaa42c57a
工作。这是怎么回事?在最后一段添加了“意图”。我会看看我是否能澄清创建分支的原因……也许我在这里有些迟钝。我知道RHS控制着我自己的名字,所以我对“git fetch repo:f1e32e18a90e10c150221af55c69aeafaa42c57a”创建了一个名为f1e32e18a90e10c150221af55c69aeafaa42c57a的本地分支并不感到惊讶。令我惊讶的是,它还获取了遥控器上的id是相同的,尽管当我把它放在LHS上时,提交是不可寻址的。啊,是空的LHS造成了混乱
$ ssh our.origin.host 'cd /repos/repo.git; git tag temporary f1e32e1'
[enter password, etc; observe tag created]
$ git fetch origin refs/tags/temporary:refs/heads/newbranch
[observe fetch happen; now you have local branch 'newbranch']
$ ssh our.origin.host 'cd /repos/repo.git; git tag -d temporary'