Visual Studio 2013 no longer tracking changes using Git with Visual Studio Online
我正在使用Visual Studio Premium 2013更新5管理由多个项目组成的解决方案。我最后一次成功的在线承诺是10月18日晚上。我的电脑在19日早上重新启动,安装了大量的微软更新。我在19号做了一些小的发展工作。在提交更改时,我注意到在解决方案资源管理器中右键单击解决方案时,提交选项不可用。
在调查我为什么不能承诺时,我注意到以下行为。我打开一个文件,进行更改,文件名旁边会出现红色的复选框,文件显示在"包含的更改"下。当我保存文件时,红色的检查将消失,文件将从包含的更改中消失。由于Git没有跟踪任何更改,因此没有任何内容可以提交到Visual Studio Online。我还注意到团队资源管理器-管理连接-本地Git存储库部分缺少该项目的Git repo(/portal)。
然后,我使用Visual Studio 2015 Ultimate Update 3打开了另一个解决方案,注意到我的Git repo(/portal)位于"管理连接"下。然后我可以做一个git状态并发现了以下问题。见下图。
。
由于我的Git repo(/portal)丢失,我使用Visual Studio 2013再次克隆了该解决方案。Visual Studio创建了一个新的git repo(/portal 2),现在它也显示了我的原始repo(/portal)。所包含的更改中仍缺少我最近的更改,因此它仍然无法正常工作。
在这个阶段,我不确定损坏的文件是否是问题所在,或者更新5(几个月前下载过,但似乎安装在19或20上)是否是问题所在。
更新1:
要求运行git fsck。这是结果。
氧化镁
更新2:
基于代码提要注释,我使用新的repo(/portal 2)进行了代码更改测试。它按预期工作。我对一个文件进行了更改,在保存该文件后,红色的复选框仍然显示。我还运行了git状态,没有报告任何问题。
更新3:
最后一条语句(git push-u origin share)产生以下错误。
氧化镁
Git用户界面中也缺少共享分支。
氧化镁
任何帮助都非常感谢。
- 你试过运行git fsck吗?
- 我刚跑过。请参阅更新1。谢谢!
- 我总是觉得Visual Studio集成有点可疑。你能在命令行上重新克隆它吗?git clone ,然后尝试Git状态…
- @代码提要我刚刚测试了我使用Visual Studio UI创建的新repo(/portal 2),它似乎可以工作。Git状态也显示没有问题。似乎原始/旧repo(/portal)中损坏的松散对象导致了问题。
- 松散对象损坏问题主要是意外造成的,您可以参考相关问题stackoverflow.com/questions/4254389/git-corrupt-loose-object和stackoverflow.com/questions/26599706/…。而对于VS2013来说,跟踪Git回购的变化并不是问题。
- @Marina MSFT感谢您的评论,但我该如何从中恢复呢?
- 我增加了一个恢复回购的答案,你可以试试。
- @Marina MSFT谢谢!这似乎很有帮助。如果对本地(/portal)repo进行这些更改,是否需要删除Visual Studio Online中的任何内容?我问的原因是,有问题的文件/目录树的日期是17年10月18日晚上11:06。这与上次成功提交的时间完全相同。此损坏的文件是否也在Visual Studio Online中创建了问题,或者只是本地问题?我认为这对于每个经历过这个问题的人来说都是很重要的。另外,我假设我要使用命令行工具运行您答案中的所有语句。对的?
- 这是当地的问题。它的工作原理是在最新提交的基础上恢复损坏的提交。例如,上次提交是在本地repo在尝试提交提交提交B的更改时损坏之前的A。之后,即使您的远程回购有新的变更commit C(目前最新的commit),该操作的目标是恢复在最新的commit C之后的commit B'。承诺历史看起来是:..---A---C---B'。是的,这些命令应该由git命令行执行(如cmd、git bash等)。
- @邓伯特桑2号,我也在我的答案中添加了插图:)
- @Marina MSFT共享分支中发生了腐败。目前有两个分支。一个叫做主人,另一个叫做分享。这是否会更改git命令行语句?另外,我应该重命名.git文件夹还是删除它?我可以做ren.git.git-old,然后如果一切正常,运行rm-rf.git-old作为清理的一部分。你能推荐吗?谢谢!
- 另一个分支机构也可以。删除旧的.git文件夹并从远程创建和获取新的.git文件夹后,恢复origin/master分支的历史记录,可以通过git checkout master进行复查。
- 对master分支来说是可以的,需要注意的一点是:因为腐败的对象发生在share分支上,而新的草签repo的分支名称是master分支。执行命令后,可以通过git branch -m share重命名本地master分支。并通过git checkout master再次检查您的远程主分支。
- @Marina MSFT我被困在最后一步。请参阅更新3。另外,我在Windows10上使用命令行。我不得不使用这个语句rmdir/s/q.git,这个语句也是git commit-m"恢复repo损坏之前的最后一次提交"。请告知。谢谢!
- @如果存在共享分支,请登录VSTS中的远程回购,您是否为share分支设置了分支策略或分支安全?
如果在对象损坏后没有更改任何文件,则可以恢复本地repo(/portal)。具体步骤如下:
1 2 3 4 5 6 7 8
| #In the directory for Portal
rm -rf .git
git init
git remote add origin <repo URL> -f
git reset origin/share
git add .
git commit -m 'recovery the last commit before the repo corrupt'
git push -u origin share |
现在,上一次更改已恢复并推送到远程share分支。
注:当地master分公司实际跟踪origin/share分公司。为了方便起见,可以通过git branch -m share将本地master重命名为share分支。为了检查远程master分支的历史记录,可以使用git checkout master。
恢复提交就在最新提交的基础上(远程回购没有问题)。如下图所示:
假设commit A是本地repo在尝试将更改作为commit B提交时损坏之前的最后一次提交。之后,即使您的远程回购承诺发生了新的变化,C。远程回购的提交历史记录如下:
号
执行上述命令后,恢复的commit B'将位于最新commit C的顶部。所以提交历史将是:
- 这是一个巧妙的方法来解决一个"坏"的git repo+1:。