簡體   English   中英

如何重新初始化 git 裸倉庫以便再次發布所有文件?

[英]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 ,或者
  • 使用 post-receive hook 使用裸存儲庫執行git --work-tree=<path> checkout -f

您確實在標題和正文中都提到了“裸存儲庫”,所以也許您設置了這樣的 post-receive 掛鈎。 如果是這樣的話:

  1. 確保你的 post-receive hook 真的有效。 (這有點難以測試,但一種方法是讓它每次運行時將某些內容記錄到/tmp文件中,以便您可以觀察它的運行情況。)

  2. 請記住,您現在(ab?)使用 Git 的索引來索引/緩存--work-tree路徑。 只有一個索引,所以這只適用於一個工作樹。

  3. 請記住git checkout -f檢查當前分支 如果git push實際上更新了那個特定的分支名稱,那么這樣做才真正有意義(但在其他情況下通常應該是無害的)。 一個裸倉庫有一個當前分支,就像任何倉庫一樣。 它還有一個索引,這有點奇怪,但就像任何存儲庫一樣。 索引索引並緩存工作樹。 一個裸存儲庫沒有工作樹,這就是為什么它有一個索引很奇怪......但是在git checkout ,你臨時設置它(在那個git checkout命令的持續時間內)工作樹。 這就是該索引正在索引/緩存的工作樹。 任何以后的git checkout最好使用相同的路徑,否則索引將索引錯誤的工作樹。

    在裸倉庫中,當前分支通常從master開始,通常保持master 所以你要檢查的提交是master的提示提交。 只要名稱master仍然標識相同的提交,添加新的分支名稱和/或更改其他分支名稱標識的提交就沒有任何影響。

  4. 如果你正在使用其他命令——或者git checkout -f和其他參數——把它放在你的問題中; 我們需要看到這一點,然后才能真正提供幫助。

如果指數是同步進行與實際工作樹-這可能是因為其他的事情,比如你的Web服務器自身,操縱工作樹中的文件git checkout可能無法正常挺你想要的方式。 我個人認為,正確的做法是不要嘗試使用Git的作為部署系統,但我沒有什么要么使用任何建議。

暫無
暫無

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

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