2012-09-27 100 views
3

我是git的初學者,並且已經通過創建本地存儲庫來測試本地計算機上的幾個命令,以便從中拉出和推送。Git:通過標籤從遠程拉出

我在'項目'中設置了一個裸倉庫,並從中克隆了兩個用戶:'user1'和'user2'。該項目目前具有文件'one.txt','two.txt'等,以及與添加新的「#.txt」文件相關聯的一些標記爲「v1.0」,「v2.0」等的提交。

然而,當我試圖創建一個新的文件夾「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

回答

1

您已在您的歷史記錄中添加標籤。您可以使用git tag -l列出所有可用的標籤,並且您可以隨時給他們git checkout

git checkout v1.0 
+0

tmp是一個新的目錄,用'git init'初始化。我將項目存儲庫添加爲名爲'origin'的遠程,但'tmp'不是克隆,因此它沒有任何標籤或文件。我試圖看看我是否可以通過標記而不是通過分支從遠程獲取。 對不起,如果我不清楚,我編輯了我原來的帖子,以反映它。 – ImpGuard

+0

啊 - 在這種情況下,不,你不能通過標籤拉。正如其他人所說,這不是什麼標籤,你似乎來自SVN。 Git是非常不同的,一旦你習慣了它,更好。 – vinnydiehl

+0

我明白了。在這種情況下,我想知道爲什麼它在我學校的git系統上運行。我試圖這樣做的唯一原因是因爲我的學校讓我們把我們的家庭作業/項目推到一箇中心倉庫,標記爲作業類型「hw1」,「proj1」,然後讓我們測試我們是否通過創建一個新的git目錄並應用命令:'git pull origin hw1'。它適用於學校電腦,但它似乎不在我自己的測試庫中。 – ImpGuard

2

所有你想要做的就是創建另一個克隆。除非你有充分的理由不這樣做,否則它將複製所有的歷史記錄(不用擔心,它通常是svn repo大小的10%,並且通常比壓縮後的工作目錄小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 

兩個操作fetchmergepull同時完成。所以你可以這樣做,而不是

git pull origin master 

因此,標籤獲取。這意味着當你意識到拉是取和合並(或者如果你想要的話)。

+0

這不是我的意思。我想創建一個新的git目錄tmp,並在其中初始化git,並通過標記而不是分支從遠程目錄中提取。它應該工作,但由於某種原因我得到了這個錯誤。 – ImpGuard

+0

你不明白拉什麼意思。你不能「通過標籤拉」。我會編輯答案,告訴你如何做你想做的。 –

+0

我瞭解拉和推的基本系統。是的,克隆和普通推/拉/取操作很好。我想知道爲什麼拉標籤沒有。 在我的學校,提交任務的過程是通過標記提交併將其提交給分配給我們的存儲庫。然後,爲了檢索作業,我的教師只需「git pull hw1」,其中hw1是標籤。它的作品。它似乎不適用於我自己的自制存儲庫。 – ImpGuard