2016-02-05 80 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