簡體   English   中英

Git從遠程裸存儲庫中提取

[英]Git pull from remote bare repository

當我嘗試pull從一個光禿禿的遠程存儲庫,git的回報Already up-to-date

據我了解,如果本地倉庫有一些變化,我犯從而將它們推進HEAD ,不應該pull取從裸遠程倉庫的不同文件(工作已被正確配置的樹),並與他們合並當地人覆蓋變化?

如果本地存儲庫已經更改並且提交了這些更改,那么推送當然是有效的 - 另一方面,拉動卻沒有。 如果遠程倉庫的變化和我pullfetch --allclone的話,我要么得到同樣up-to-date消息或舊的文件/以前壓的文件。

我究竟做錯了什么?

編輯 ,提供有關我想要做的更多信息。

我有一個包含兩個文件的本地存儲庫, foo.cfoo.exe ,以及配置了post-receive掛鈎的裸遠程存儲庫,用於將所有推送的文件放入工作樹中。

發出git push remote master ,我可以在工作樹目錄中看到foo.cfoo.exe 如果在本地存儲庫中修改了這兩個文件中的任何一個,則git add . git commit -m "commit"將跟蹤修改后的文件,隨后的git push remote master服務器將更新服務器上的文件。

如果在服務器上添加了foo.h ,無論如何,我嘗試git fetch remote master ,git說本地分支是最新的並且沒有合並(用本地替換獲取的提交文件,是嗎? ) 是必須的。 那怎么回事? 我是否需要首先在遠程存儲庫上提交更改?

基於編輯的問題更新

...來自裸露的遠程存儲庫(工作樹已正確配置)...

所以我理解這意味着您將repo初始化為--bare然后添加了一個工作worktree (更新配置以允許接收更新已簽出分支的推送),以便推送可以有效地部署您的可執行文件。

所以你原來說

如果遠程存儲庫發生更改並且我從中獲取 - 獲取 - 或從中進行克隆,則會獲得相同的最新消息或舊文件/先前推送的文件。

后來加了

如果在服務器上添加了foo.h,無論如何,我嘗試git fetch遠程master,git說本地分支是最新的並且沒有合並(用本地替換獲取的提交文件,是嗎? ) 是必須的。 那怎么回事? 我是否需要首先在遠程存儲庫上提交更改?

所以這里的問題是說“添加到遠程存儲庫”的意思。

每個回購(裸或其他)的工作方式相同。 您認為服務器存儲庫是一個遠程服務器,因為它在您的克隆中已經配置,但在服務器上,它只是一個本地存儲庫,恰好設置為以某種方式對推送作出反應。

所以你知道如果你把一個文件放在你的本地工作樹中,但你沒有添加並提交它,它就不會與其他的repos共享。 服務器上也是如此。 將foo.h放在服務器上只是意味着工作樹中有一個未跟蹤的文件。 (並且您要小心在服務器上進行無需更改的更改;它們可能會在將來的推送嘗試中造成混淆。)

pushfetch操作共享數據庫之間的refs和對象(提交及其依賴關系)。 這些操作並不關心“發送方”工作樹上的內容。 除了可能的安全措施以避免破壞文件之外,他們也不關心“接收方”工作樹上的內容。

簡而言之:是的,在服務器上你必須添加並提交文件,在分支上創建一個新的提交,然后在工作站上拉動任何東西。


我原來的答案部分沒有包含在上面繼續從這里繼續:

如果本地存儲庫有一些更改,並且我提交它們從而推進HEAD,則不應從裸存遠程存儲庫中提取不同的文件

更確切地說, pull執行fetch和“合並”,並且您要求不應該從遠程fetch文件以進行merge 答案是:只有自從你之前的fetch / pull它們已經改變了。 消息“已經是最新的”意味着遠程端沒有任何變化,超出了你已經fetch ,所以沒有什么新東西可以合並。 考慮:

遙控器包含一些提交

A --- B --- C <--(master)

clone了repo,或者fetch到現有克隆,所以現在你有相同的; 然后你做一些工作並提交它

A --- B --- C <--(origin/master)
             \
              D <--(master)

現在你pull ,這導致了一個fetch 但是fetch並不直接下載文件 - 它會下載提交。 您已擁有源中的所有提交,因此無需下載; 這很好,因為文件的歷史(因為它們出現在原點)已經被考慮(從你首先fetch ed C時開始)。

git fetch / push不對文件進行操作。 他們在提交時運作。 遠程有一堆提交(無論是否裸露都無關緊要)。 如果您在本地更改了某些文件並進行了提交,則本地存儲庫與遠程存儲庫之間存在差異。

在您的情況下,您已經在本地擁有遠程可用的所有提交,因此無需獲取任何內容。 這就是最新消息的原因。

如果在這種情況下運行git status ,您將獲得一個信息,即您在本地存儲庫中的某些更改未與遠程資源共享:

On branch master
Your branch is ahead of 'origin/master' by 1 commit.
  (use "git push" to publish your local commits)

nothing to commit, working directory clean

當您按照建議發布更改時,兩個存儲庫(本地和遠程)將具有相同的提交(假設沒有其他人正在修改遠程存儲庫),因此,再次拉動不會獲取任何內容,這些更改已在本地可用。

但是,如果您在遠程存儲庫上有一些提交,但在本地提交時沒有提交,則情況會有所不同。

git fetch將獲取這些提交,但它不會修改工作區中的文件。 要修改文件,您需要手動移動到新提交。 例如,通過運行git merge命令 - 它將新獲取的更改合並到本地分支,並將活動提交更改為本地分支的一個提示。 值得注意的是, merge僅合並當前分支上尚未提供的更改。 所以,如果你過去有一些提交並運行git merge old_commit_id ,那么什么都不會發生。

git pull就像當前分支的git fetch + git merge一樣。 因此,如果遠程提交,則會獲取它們。 然后,如果當前分支有來自遠程分支的更改,但尚未在當前分支上進行更改,則它們將被合並。

值得使用gitggitk工具來可視化提交和分支標簽的圖形,以更好地理解內部發生的事情。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM