2011-10-11 79 views
0

我使用git,試圖同步到去年每月的第一次提交。我希望能夠在本月的第一個月的第一天逐月回顧。或至少從某個恆定的「秒」值。到目前爲止,我有這樣的:如何回到cygwin的日期,返回日期與靜態第二值

$(git rev-list --before "$(date -d "$(date +%Y-%m-01) -$i months" +%Y-%m)-01" -n 01 HEAD)

這顯然不包括恆定秒值。就目前而言,運行這個腳本然後在一個小時後再次運行它返回兩個不同的sha1,因爲它從我運行腳本的精確時間開始返回x個月。無論何時運行此腳本,我都希望返回的sha1是相同的。那有意義嗎?有任何想法嗎?

回答

0

首先,您的命令中有排字錯誤。它必須是--before="$(...,您錯過了=

date的行爲在這裏不是問題。 date +%Y-%m-01將會返回類似2011-10-01的字符串,因此不會包含其他時間信息。因此,第二次約會電話會將其減少$i個月,並且還會返回類似2011-09-01這樣的格式。除此字符串外,沒有其他信息作爲參數--before=的值傳遞給git-rev-list

有一些事情你必須考慮使用git-rev-list

  1. 當使用HEAD你總是指當前分支。因此,例如,當您檢出其中一個獲取的提交ID時,您的HEAD將會更改。您可能希望使用master或任何其他分支名稱作爲參考。
  2. Git有沒有時間順序的提交。您可以在於9月1日提交後在8月1日之後進行分層次撰寫。當使用--before--after參數時,這會導致輸出混淆,因爲它們依賴提交者字段的時間戳。
  3. 提交者字段的時間戳也可能會引起誤解。當你的分支沒有線性歷史記錄時,很難判斷一個提交是否已經成爲歷史中某個特定時刻倉庫中分支的一部分。提交人可能在提交後的X個月內推送/合併了他的分支,因此其他人無法看到它。

考慮到所有的說,下面的命令對我的作品:

$(git rev-list --after="$(date -d "$(date +%Y-%m-01) -$i months" +%Y-%m)-01 00:00:00" master | tail -n 1)

這將返回的該ID的第一個給定的一個月後第一次提交。 (這個提交不一定是在那個月進行的,也許那個月沒有提交任何提交。)

+0

謝謝Scolytus,對學習者非常有見地。我會嘗試使用'master' – blaughli