2016-02-05 92 views
2

可能失去了一些東西真的很瑣碎,但在這裏努力想法子了..文件在Visual Studio團隊服務不同步(GIT回購)

我們有Visual Studio團隊服務一個Git倉庫設置。 自2月1日以來,幾個文件似乎與其提交歷史不同步。他們的歷史包含了大量最近的變化,但是當拉動最新版本時,我們實際上得到了舊版本。

目前尚不清楚團隊中的任何人是否可能在遠程存儲庫中意外發出了奇怪的命令。

但是,顯而易見的是,通過VSTS門戶網站顯示的「當前」遠程版本似乎比它們應該根據其歷史記錄更早(因此不是僅有本地回購的問題)。

下面就是一個例子:

當前版本

Current version (latest - not.latest)

變化歷史

File history

最新提交

Latest commit

即使最後提交的說明中添加了一些新的線路,該文件的「當前版本」不包含他們。而沒有其他犯歷史!

如何驗證所發生的事情到遠程回購和修改,或者任何建議,這是否是在VSTS一個已知的問題(他們最近已經有問題,服務下降了昨天..)

回答

2

這很可能是由於拙劣的合併。可能發生的事情是,有人做了拉,衝突,解決了衝突,然後在合併之前注意到他有一些不是他的變化(並且不以任何方式與衝突有關)。他認爲這是一個奇怪的git bug或其他東西,並放棄這些更改,然後提交。那些被丟棄的變化是你錯過的變化;他們應該已與該合併提交。爲什麼在文件的歷史記錄中沒有看到這個「撤銷」提交的原因是,默認情況下,git(和其他工具)不會在文件歷史記錄中顯示合併提交,除非該文件與兩個合併父項不同。如果您執行git log <filename> --full-history,則應該看到將文件恢復爲較舊版本的合併提交。故事的道德:當進行合併時,即使(或者尤其是如果)你沒有製作它們,也要進行所有階段性的更改。

編輯:一個約拙劣的合併危險的事情是,他們可以發生沒有人注意到有一段時間,特別是因爲他們沒有在文件(S),其變化是失去了默認git log露面。以下腳本將檢測大多數錯誤的合併,報告哪些文件丟失了更改。它可以被調整爲用作提交鉤子,僅檢查某些提交等。它通過查看是否有任何文件由合併恢復到它們在兩個分支上次分叉時所處的狀態而起作用。

請注意,當涉及到shell腳本時,我是一個新手,所以請原諒糟糕的代碼質量。

isChangeInBaseChanges() { 
    for element in ${baseChanges[@]}; do 
    if [ $element == $change ] 
     then 
     return 1 
    fi 
    done 
    return 0 
} 


for merge in `git rev-list --min-parents=2 --all`; do 
    mergeChanges=`git log -m -1 --name-only --pretty="format:" $merge | sort -u` 
    mergeBase=`git merge-base $merge^ $merge^2` 
    baseChanges=`git diff --name-only $merge $mergeBase` 

    lostFiles=() 
    for change in ${mergeChanges[@]}; do 
    isChangeInBaseChanges 
    if [ $? -ne 1 ] 
    then 
     lostFiles+=($change) 
    fi 
    done 

    if [ ${#lostFiles[@]} -ne 0 ] 
    then 
    echo -n "Possible botched merge at " 
    echo $merge 
    echo "files with lost changes are: " 
    for lostFile in ${lostFiles[@]}; do 
     echo $lostFile 
    done 
    echo -------------------------------------------- 
    fi 

done 
+0

聽起來合理,但做了'git的日誌--full歷史-p HomeController.cs'正好顯示了相同的歷史和變化,我們可以在門戶網站上看到(即沒有當缺少的線被拆除的痕跡)? – Strillo

+0

@Strillo - 嗯,這是令人驚訝的。該命令不會顯示修改後的合併,但它肯定應該列出合併本身。這是一次公開回購,我可以看看嗎? –

+0

不幸的是公衆回購。我終於能夠確定違規合併。正如你所提出的代碼衝突管理不當,將遠程版本替換爲較舊的本地副本。然而,我只能使用VSTS的網絡歷史資源管理器識別這個..仍然不能找出一個Git命令來獲得相同的信息 – Strillo

相關問題