[英]How to reinitialise a git bare repo so all files are published again?
我在一個網站上工作,我正在使用 git 進行版本控制。 我設置了一個用於測試目的的服務器,在那里創建了一個 git 裸倉庫並推送了 master 分支( git push staging master
)。
我收到一個錯誤 - 我忘記正確設置目標文件夾的權限。 我修復了權限,再次嘗試推送……但是 git 說一切都是最新的。 添加標志 -f 沒有任何區別。 因此,由於這是一次新的推送,我刪除了裸存儲庫,重新設置,一切正常。
最終,我為我打算在合並到生產分支之前測試的功能創建了一個新分支。 然后我在生產分支上做了一些錯誤修復,所以我重新設置了測試分支以保留這些錯誤修復。 最后我用git push staging new-branch
發布了它。
但是,它沒有按預期工作。 新分支更新基礎中存在的一些更改並未將其發送到遠程服務器。 我一定是做錯了什么,所以我最好再推一遍……哦。 就像以前一樣,我不知道該怎么做。
那么,如何強制 git 重新上傳所有文件而不刪除裸倉庫並重新配置它?
我也試過git push staging new-branch --delete
並在之后重新推送它,但在那之后仍然缺少丟失的提交。
編輯:
我推送到的遠程分支是使用git init --bare
創建的,它的hooks/post-receive
配置為:
#!/bin/sh
git --work-tree=/var/www/html --git-dir=/home/<nu_username>/repo/site.git checkout -f
編輯2:
我想我終於開始理解什么是最明顯的:(ab)使用 git 進行發布實際上是一個兩步過程。 首先推送更改,然后檢出 repo。 我一直認為這是一個單一的動作,不了解現實中發生的事情。
因此,在我描述的兩種情況下,更改都被成功推送。 問題總是出在結帳上。
在情況 1 中,repo 的權限設置正確,因此更改被正確推送。 由於 repo 是最新的,進一步的推送嘗試不會觸發 post-receive 鈎子。
在情況 2 中, new-branch
的更改被正確推送,但實際檢出的分支是master
。 此外,我沒有推送master
的最新提交。
在這兩種情況下,檢查遠程存儲庫的正確分支將首先發布我希望它發布的更改。
因此,這完全是由於對我編寫git push
和服務器上顯示的文件之間實際發生的事情的巨大誤解造成的。
你從幾個誤解開始,我認為這是一個糟糕的整體計划(盡管很多人成功地使用了它)。
特別是:
Git 不發布東西。 Git 通過 Git對象數據庫生成、存儲和操作提交。 提交以整個提交為單位存儲文件:您要么有一個提交(其中包含所有文件的快照),要么沒有提交。
Git 從不推送文件。 Git 推送提交。
這兩者都意味着,至少對我來說,Git 是一個非常糟糕的部署工具。 人們確實將它用作一個,但要這樣做,您必須稍微扭轉它。 你還沒有描述你是如何扭曲它的,這是這里的一個問題。
將 Git 轉變為部署系統的兩種常見方法是:
receive.denyCurrentBranch
設置為updateInstead
,或者git --work-tree=<path> checkout -f
。您確實在標題和正文中都提到了“裸存儲庫”,所以也許您設置了這樣的 post-receive 掛鈎。 如果是這樣的話:
確保你的 post-receive hook 真的有效。 (這有點難以測試,但一種方法是讓它每次運行時將某些內容記錄到/tmp
文件中,以便您可以觀察它的運行情況。)
請記住,您現在(ab?)使用 Git 的索引來索引/緩存--work-tree
路徑。 只有一個索引,所以這只適用於一個工作樹。
請記住git checkout -f
檢查當前分支。 如果git push
實際上更新了那個特定的分支名稱,那么這樣做才真正有意義(但在其他情況下通常應該是無害的)。 一個裸倉庫有一個當前分支,就像任何倉庫一樣。 它還有一個索引,這有點奇怪,但就像任何存儲庫一樣。 索引索引並緩存工作樹。 一個裸存儲庫沒有工作樹,這就是為什么它有一個索引很奇怪......但是在git checkout
,你臨時設置它(在那個git checkout
命令的持續時間內)工作樹。 這就是該索引正在索引/緩存的工作樹。 任何以后的git checkout
最好使用相同的路徑,否則索引將索引錯誤的工作樹。
在裸倉庫中,當前分支通常從master
開始,通常保持master
。 所以你要檢查的提交是master
的提示提交。 只要名稱master
仍然標識相同的提交,添加新的分支名稱和/或更改其他分支名稱標識的提交就沒有任何影響。
如果你正在使用其他命令——或者git checkout -f
和其他參數——把它放在你的問題中; 我們需要看到這一點,然后才能真正提供幫助。
如果指數是同步進行與實際工作樹-這可能是因為其他的事情,比如你的Web服務器自身,操縱在工作樹中的文件git checkout
可能無法正常挺你想要的方式。 我個人認為,正確的做法是不要嘗試使用Git的作為部署系統,但我沒有什么要么使用任何建議。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.