2012-06-22 49 views
8

我有一箇中央Git裸存儲庫。當對該回購進行推送時,我想運行後接收掛鉤。該鉤子會做什麼是在Basecamp項目上創建一條消息(使用他們的API)。我想了解剛纔執行的更新。現在我認爲git log -2 --stat已經足夠好了,但是想多瞭解一些信息(已更新的分支,已創建的文件,已刪除的文件)。任何人都可以使用我需要做的命令來獲得所有信息嗎?執行多個命令對我來說沒什麼問題,可能沒有一個命令可以獲取所有信息。獲取Git存儲庫的上次提交

回答

3

你可以找到最新的承諾通過檢查和.git/refs/heads下整理文件:每一個新的提交是由時間,相應的refs/heads文件被更改,即承諾master時,refs/heads/master被更新。

因此,我們來開發一個解決方案。

首要任務:找到所有分支(即所有文件refs/heads下,並打印出來,當他們最後改變了你說的是掛鉤的,所以我們給予的相對路徑至.git/hooks目錄:

find ../refs/heads -type f -printf '%[email protected] %p\n' 

這將產生與他們的更改日期以及所有分支的列表,請參閱man page of find爲參數的說明

第二個任務:。排序獲得的列表

find ../refs/heads -type f -printf '%[email protected] %p\n' |\ 
sort 

第三個任務:我們需要在列表中的最新元素。由於sort從舊到新排序,我們期望的項目位於列表的底部。獲取此元素與tail(只有一個項目,因此通過-1標誌):

find ../refs/heads -type f -printf '%[email protected] %p\n' |\ 
sort |\ 
tail -1 

第四任務:在所獲得的線下降的時間。從我們的printf聲明中,我們知道日期和路徑以空格分隔。以分隔符的形式輸入cut-d " "),並告訴它我們需要第二個字段(即文件路徑-f 2)。爲方便起見,我們將存儲此文件的路徑在一個名爲$LATESTHEAD變量:

LATESTHEAD=$(\ 
    find ../refs/heads -type f -printf '%[email protected] %p\n' |\ 
    sort |\ 
    tail -1 |\ 
    cut -d ' ' -f 2) 

第五項任務:現在我們知道了文件名,但我們需要的內容。這是最新的修改,可以傳遞給git logcat完成這項工作。在$LATESTREV

LATESTHEAD=$(\ 
    find ../refs/heads -type f -printf '%[email protected] %p\n' |\ 
    sort |\ 
    tail -1 |\ 
    cut -d ' ' -f 2) 
LATESTREV=$(cat $LATESTHEAD) 

存儲最新版本現在,你可以使用$LATESTREV,做你想做的任何髒東西。

也許不是最優雅的解決方案(可能有人會來,並告訴你一個更容易的單線)但爲我工作。

+0

這實際上工作得很好。我也需要分支名稱,所以我想我必須首先運行** Third Task **到分支名稱。之後,我運行**第五任務**獲取提交哈希。之後,我運行'git log --stat -1 '獲取完整的提交信息。奇怪的是我必須添加'-1'。我不,它給我每隔......奇怪。反正它看起來像是有效的!謝謝eckes! – Jeebs24

+0

對不起,我推薦我的答案,但我不明白你爲什麼在這裏找到,如果所有的信息都是通過git在調用post-receive時在stdin上給出的(參見[githooks(5)](https://www.kernel)。組織/酒吧/軟件/ SCM /混帳/文檔/ githooks.html#後接收))。 –

2

添加--summary送至git日誌將產生新的和已刪除的文件列表(GIT是指他們爲 「節點」):

git log --stat --summary -1 

爲了得到分支,嘗試運行:

git branch --contains `git log --oneline -1 |cut -f1 -d\ ` |cut -b3- 

注意:我在我的Mac上測試這個。 Unix cut是1索引,但我相信Debian cut是0索引。如果是這樣,如果你是一個Debian中,更改-f1-f0和分支指令應該只是罰款

1

如果沒有,爲什麼你使用post-receive具體的理由,我寧願建議使用update,它得到老ref,新的ref和分支作爲命令行參數。

因此,你可以使用這裏建議,並給予oldref..newref作爲參數git log命令只得到了整個日誌(分別替換oldrefnewref)。

欲瞭解更多信息,請參閱githooks(5) manpage on the update hook。如果需要,您甚至可以在此時中止更新。

實際上,您在stdin的post-receive鉤子中獲得了相同的信息。我不明白你爲什麼需要做很多find命令來完成這項任務。

+0

如何獲取'oldref'和'newref'的信息?我對Git和鉤子很陌生。我把我的Git回購與我的Basecamp連接起來,像魅力一樣工作。但如果有更好的方法,我可以獲得更多信息,甚至更好。我會繼續閱讀githooks(5)手冊頁,但如果您可以提供相同的內容,我會非常感激。 – Jeebs24

+0

好的,我改用'update'鉤子代替。感謝Jonas的建議。 – Jeebs24