2016-08-07 55 views
1

我的目標是僅當最近的備份不再有效時纔在UI中提供「備份回購」選項,所以我需要一種有效的方法來確定是否對回購進行了任何更改。如何檢測git倉庫是否有任何更改?

我首先想到的是將repo中每個目錄的修改時間進行散列,我將與備份中計算的相同值進行比較。這會起作用嗎?有沒有更好的辦法?

+0

到目前爲止對答案的兩點評論:(1)我不認爲有遠程回購。 (2)我對回購的全部內容感興趣,不僅僅是一個分支,而不僅僅是託管文件。更改配置或添加標籤會被視爲更改,因爲這意味着我需要更新備份。爲了清楚起見,我正在處理一個非常大的repo,這個repo不會經常更改,因此可以將其排除在普通的定期增量備份之外。 –

回答

0

您可以解析的輸出...

git fetch --dry-run origin 
0

...我首先想到的是每個目錄的修改時間湊在一起回購,這我會用相同的值進行比較在備份上計算。這會起作用嗎?有沒有更好的辦法?

是的,你可以檢查,看看是否有來自服務器的任何未決的改變:

# grab all latest changes 
git fetch 

# check to see if there are any changes 
git diff <origin/branch> ^branch 

# or 
git diff ^<branch> origin/branch 

一個是拉力和第二個是推


另一種方式是假設你沒有進行交互式數據庫[squash],則獲取並計算每個分支中提交的數量。

git rev-list --count 
1

你真的只是想看看(取後價格)的遠程跟蹤分支來源/分支是一樣的本地跟蹤的分支,所以只檢查SHA這樣的(後面跟一個合併的抓住你了)。所以你可能只是在origin/branch上做一個rev-parse,然後將它與分支的rev-parse進行比較,因爲無論有多少提交或哪些更改在哪裏,只要有更改(或一個git日誌--oneline origin/branch..branch通過管道連接到wc -l,類似的東西)。

您對整個目錄散列的想法與實際計算提交的SHA的方式類似,因此只使用SHA即可實現此目的。請注意,如果某人進行了提交,然後進行了回覆,並且因此您使用相同的內容結束,那麼SHA會隨着每個後續提交而更改(因爲它們還包含提交信息以及父SHA),所以我的建議會失敗,但我會認爲這是一個不太可能發生的情況,而不是你需要優化的情況。

所以我的方法假定你有一個本地回購,你是從遠程克隆。如果不是,或者你不想拉下整個遠程回購,你可以做一個淺層克隆來獲得提示,並記住提示是什麼。

但是,更好的方法是使用git ls-remote並解析輸出並記住它的狀態並在下次運行時進行比較。

NAME 
     git-ls-remote - List references in a remote repository 

SYNOPSIS 
     git ls-remote [--heads] [--tags] [--upload-pack=<exec>] 
        [--exit-code] <repository> [<refs>...] 

DESCRIPTION 
     Displays references available in a remote repository along with the associated commit IDs. 

你會看到輸出類似如下:

From https://github.com/foobar/myRepo.git 
3133d81f8cca51c73c92aeeaa1c762b177683456 HEAD 
3133d81f8cca51c73c92aeeaa1c762b177683456 refs/heads/master 

所以你看它列出遠程的頭,以及其參考文獻和進行解析時並保存它的一個簡單的事情。

相關問題