Git:通过标签从远程拉取

3
我是一个git的初学者,一直在本地计算机上通过创建本地存储库进行拉取和推送来测试一些命令。
我在“project”中设置了一个裸存储库,并从中克隆了两个用户:“user1”和“user2”。该项目目前具有文件“one.txt”,“two.txt”等,以及一些提交标记为“v1.0”,“v2.0”等,这些提交与添加新的“#.txt”文件相关联。
但是,当我尝试在新文件夹“tmp”中创建一个新的git工作目录,将项目添加为远程存储库(tmp不是克隆),并进行拉取时,我会收到错误提示:
$ git pull ../project v1.0
$ fatal: 'v1.0' does not appear to be a git repository
$ fatal: The remote end hung up unexpectedly

当我尝试从项目中拉取主分支时,这种情况并不会发生,因此我认为我有权限进行拉取。发生了什么事?


2
你似乎是来自SVN背景的。忘掉你所知道的一切,从头开始。 - Daenyth
1
我完全没有编程背景。我只是在学校机器上复制我的教师所做的来检索我提交的作业,通过推送标记的提交。在他们的机器上似乎完美地运行。但在家里复制似乎会产生不同的结果。 - ImpGuard
2个回答

3
你想要做的就是创建另一个克隆。除非你有充分的理由不这样做,否则它会复制所有历史记录(不用担心,通常情况下它的大小只有svn仓库的10%左右,且由于压缩往往比工作目录还要小)。
创建你的第一个仓库:
mkdir myrepo
cd !$
git init
echo one > one.txt
git add -A
git commit "my first commit"
git tag v1.0
echo two > two.txt
git add -A
git commit "my second commit"
git tag v2.0

创建一个模拟中央仓库:

cd ..
mkdir centralrepo
cd !$
git init --bare # don't want to have a working directory here
cd -

创建一个模拟的合作伙伴存储库:
mkdir coworkerrepo
cd !$
git init

告诉你的仓库中央仓库的位置。
cd ../myrepo
git remote add origin ../centralrepo

告诉你的同事仓库中央仓库的位置。
cd ../coworkerrepo
git remote add origin ../centralrepo

将你的工作发布到中央存储库:

cd - # useful shortcut for flipping between two dirs (works for git checkout and branches too)
git push origin master 

放置主参考和其中的提交,但不包括标签。对于标签,请执行以下操作:
git push origin v1.0
git push origin v2.0

或者只需使用以下命令将您的存储库中的所有标签推送上去:

git push origin --tags

现在您可以使用以下方式检查远程是否具有这些标签和引用:

git remote -v show origin

切换到你的同事的代码库并获取这些更改:

cd -
git fetch # will update tracking branches and tags
git merge origin/master # fast-forward master branch to what the remote tracking branch is pointing to

pull命令可以同时进行fetchmerge两个操作。因此,你可以使用以下命令代替:

git pull origin master

标签被获取。当你意识到 pull 是 fetch 和 merge(或 rebase,如果你想要)的结合时,这是暗示的。


这不是我想要的。我想创建一个新的git目录,名称为tmp,在其中初始化git,并通过标签而非分支从远程目录中拉取。按理说应该可以运行,但出现了某种错误。 - ImpGuard
你不理解 pull 的含义。你不能“按标签拉取”。我会编辑答案,向你展示如何实现你想要的功能。 - Adam Dymitruk
我了解拉取和推送的基本系统。是的,克隆和普通的推送/拉取/获取操作都可以正常工作。我想知道为什么按标签拉取不行。在我的学校,提交作业的过程是通过给提交打上标签并将其推送到分配给我们的存储库中。然后,为了检索作业,我的教师只需使用“git pull <my_repo> hw1”,其中hw1是一个标签。它就能正常工作。但似乎在我自己的自制存储库中无法正常工作。 - ImpGuard
如果您都在使用相同的标签,他们只需迭代每个远程以获取每个标签。他们会执行类似于 git tag -l | xargs git tag -d 的操作,在清除先前版本之间进行。也许他们在自己的端侧有标记来跟踪您的过去工作。谁知道呢?问问他们。 - Adam Dymitruk
如果我自己不能做同样的事情,那就说得通了... 我所做的唯一步骤是:创建一个名为“tmp”的新目录,在该目录中进行git init。将我上传作业的存储库添加为源。 "git pull origin hw1"以拉取我的hw1提交。这就是我所做的一切,它有效。然而,根据您的回复,它不应该有效。这让我感到困惑。 - ImpGuard

1

您已经在历史记录中拥有了标签。您可以使用 git tag -l 列出所有可用的标签,并且您可以随时使用 git checkout 切换到它们。

git checkout v1.0

tmp是一个新目录,使用'git init'初始化。我将项目存储库添加为名为“origin”的远程,但'tmp'不是克隆,因此其中没有任何标签或文件。我正在尝试查看是否可以按标签而不是按分支从远程拉取。如果我表达不清楚很抱歉,我编辑了原始帖子以反映这一点。 - ImpGuard
啊,既然这样,不,你不能通过标签拉取。那也不完全是标签的用途,正如其他人所说,你似乎是从SVN转过来的。Git非常不同,而且一旦你习惯了它,会更好用。 - vinnydiehl
我明白了。在这种情况下,我想知道为什么它可以在我的学校的git系统上运行。我尝试这样做的唯一原因是因为我的学校要求我们将作业/项目推送到一个中央存储库,并标记为“hw1”、“proj1”等类型的任务,然后通过创建一个新的git目录并应用命令'git pull origin hw1'来测试我们是否正确提交。它在学校的计算机上可以工作,但似乎在我的测试存储库上不行。 - ImpGuard
奇怪,你是说学校会自动为我的标签创建分支吗?我上传作业的方法是将“hw1”文件夹/文件添加到我的主分支中。提交更改。使用“hw1”标记提交。然后应用“git push origin master”。为了检索代码(检查我是否正确上传),我创建一个单独的临时目录,用git初始化并添加远程“origin”。然后运行“git pull origin hw1”,我的作业文件/文件夹会立即下载。 - ImpGuard
这真的很奇怪,我几乎想知道他们是否设置了一些奇怪的别名,但我甚至不认为这是可能的...很抱歉我无法提供帮助,但这超出了我的能力范围。如果你最终向你的老师询问它是如何工作的,请务必回报,我真的很好奇他们在那里做了什么。 - vinnydiehl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接