我有一箇中央Git裸存儲庫。當對該回購進行推送時,我想運行後接收掛鉤。該鉤子會做什麼是在Basecamp項目上創建一條消息(使用他們的API)。我想了解剛纔執行的更新。現在我認爲git log -2 --stat
已經足夠好了,但是想多瞭解一些信息(已更新的分支,已創建的文件,已刪除的文件)。任何人都可以使用我需要做的命令來獲得所有信息嗎?執行多個命令對我來說沒什麼問題,可能沒有一個命令可以獲取所有信息。獲取Git存儲庫的上次提交
回答
你可以找到最新的承諾通過檢查和.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 log
。 cat
完成這項工作。在$LATESTREV
LATESTHEAD=$(\
find ../refs/heads -type f -printf '%[email protected] %p\n' |\
sort |\
tail -1 |\
cut -d ' ' -f 2)
LATESTREV=$(cat $LATESTHEAD)
存儲最新版本現在,你可以使用$LATESTREV
,做你想做的任何髒東西。
也許不是最優雅的解決方案(可能有人會來,並告訴你一個更容易的單線)但爲我工作。
添加--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
和分支指令應該只是罰款
如果沒有,爲什麼你使用post-receive
具體的理由,我寧願建議使用update
,它得到老ref,新的ref和分支作爲命令行參數。
因此,你可以使用這裏建議,並給予oldref..newref
作爲參數git log
命令只得到了整個日誌(分別替換oldref
和newref
)。
欲瞭解更多信息,請參閱githooks(5) manpage on the update hook。如果需要,您甚至可以在此時中止更新。
實際上,您在stdin的post-receive
鉤子中獲得了相同的信息。我不明白你爲什麼需要做很多find
命令來完成這項任務。
- 1. 如何從git存儲庫獲取上次提交日期?
- 2. 獲取VSTS的git存儲庫中的上次更新/提交的文件
- 3. 獲取git存儲父提交
- 4. 獲得之前在git存儲庫上被刪除的提交
- 5. Git存儲庫的未提交更改
- 6. Git:從前次提交中清除存儲庫中的文件
- 7. 如何從git存儲庫提取提交補丁
- 8. 第一次提交git存儲庫時遇到問題
- 9. 如何從遠程git存儲庫一次提交一個提交?
- 10. 從遠程git存儲庫中恢復未提交的提交
- 11. 提取git存儲庫的一部分?
- 12. 如何刪除我在本地git存儲庫中的上次提交
- 13. 從git存儲庫中提取所有未獲取的更改
- 14. 使用Bitbucket剝離GIT存儲庫上的提交
- 15. 如何退出DevOps上GIT存儲庫中的提交
- 16. Git撤消上次提交
- 17. GIT:恢復上次提交?
- 18. 創建獲取上次提交的Git別名
- 19. Git:從存儲庫中遠程提取
- 20. 獲取Git存儲庫的描述
- 21. Git克隆鏡像存儲庫上提交
- 22. git無法提取上游,聲明存儲庫不存在
- 23. 自上次標記以來獲取所有git提交
- 24. Git - 如何從上次合併獲取所有提交消息?
- 25. Git存儲庫內的Git存儲庫
- 26. 從Git存儲庫獲取文件
- 27. github上的git存儲庫
- 28. 在github上沒有存儲庫提交?
- 29. 如何獲取提交到存儲庫的通知?
- 30. 使用JGit獲取存儲庫中的最新提交信息
這實際上工作得很好。我也需要分支名稱,所以我想我必須首先運行** Third Task **到分支名稱。之後,我運行**第五任務**獲取提交哈希。之後,我運行'git log --stat -1'獲取完整的提交信息。奇怪的是我必須添加'-1'。我不,它給我每隔......奇怪。反正它看起來像是有效的!謝謝eckes! –
Jeebs24
對不起,我推薦我的答案,但我不明白你爲什麼在這裏找到,如果所有的信息都是通過git在調用post-receive時在stdin上給出的(參見[githooks(5)](https://www.kernel)。組織/酒吧/軟件/ SCM /混帳/文檔/ githooks.html#後接收))。 –