解决 TortoiseGit 诡异的 Bad file number 问题

http://blog.csdn.net/renfufei/article/details/41648061

 

问题描述

昨天,以及今天(2014-11-29),使用 TortoiseGit 时碰到了一个诡异的问题. 卸载,清理注册表,重装,重启,各种折腾以后,还是不能解决. 但是23.45分一过,突然灵光一闪,解决了.

问题是这样的. 使用命令行的 git pushgit fetchgit pull 什么的都没问题. 但是使用 TortoiseGit 执行拉取(pull …) 命令时, 就给报错, 报错信息如下:

 

[plain] view plaincopy在CODE上查看代码片派生到我的代码片

 

  1. git.exe pull -v –no-rebase –progress "origin"  
  2.   
  3. /libexec/git-core/git-sh-setup: line 83: /bin/sed: Bad file number  
  4. From https://github.com/cncounter/translation  
  5. = [up to date]      master     -> origin/master  
  6. D:\Develop\Git/libexec/git-core\git-pull: line 268: /bin/tr: Bad file number  
  7. Your configuration specifies to merge with the ref 'master'  
  8. from the remote, but no such ref was fetched.  
  9.   
  10. git 未能顺利结束 (退出码 1) (3510 ms @ 2014/11/29 23:51:56)  


死活各种折腾,根据提示,说: 你的配置指定了去合并(merge)远端的'master',但没有获取(fetch)到这个引用(ref).

 

然后各种测试,各种折腾,总算发现了一点规律. 如果 GitHub 在线仓库只有一个分支, 也就是 master 时, Pull 拉取就不报错, 如果在线的远端仓库有多个分支,如 master 加上 gh-pages 时,一拉取就报这个错. 但使用 git 命令行就没有这个问题. 那么问题来了, 肯定是 TortoiseGit 的哪里配置不对.

想去想来,突然想在 局部仓库的配置文件中修改下, 先看看会报错的这种配置:

 

[plain] view plaincopy在CODE上查看代码片派生到我的代码片

 

  1. [core]  
  2.     repositoryformatversion = 0  
  3.     filemode = false  
  4.     bare = false  
  5.     logallrefupdates = true  
  6.     symlinks = false  
  7.     ignorecase = true  
  8.     hideDotFiles = dotGitOnly  
  9. [remote “origin”]  
  10.     url = https://github.com/cncounter/translation.git  
  11.     fetch = +refs/heads/*:refs/remotes/origin/*  
  12. [branch “master”]  
  13.     remote = origin  
  14.     merge = refs/heads/master  
  15. [remote]  
  16.     pushdefault = origin  
  17. [credential]  
  18.     helper = store  

 

 

查看方法:

  • 打开Git项目根目录, 找到 .git 文件夹,进去里面编辑 config 这个文件,注意此文件没有后缀.
  • 还可以在项目根目录下点击鼠标右键, 选择 TortoiseGit –> Settings(设置 S), 然后选择左边的 Git –> 右边的 编辑本地.git/config 按钮,即可打开这个文件,如下图所示:

图片[5]-解决 TortoiseGit 诡异的 Bad file number 问题-第五维

那么,看看一个正常的pull拉取操作会有哪些日志输出呢?

 

[plain] view plaincopy在CODE上查看代码片派生到我的代码片

 

  1. git.exe pull -v –no-rebase –progress "origin" master  
  2.   
  3. From https://github.com/renfufei/asynquence  
  4. * branch            master     -> FETCH_HEAD  
  5. = [up to date]      master     -> origin/master  
  6. Already up-to-date.  
  7.   
  8. 成功 (5959 ms @ 2014/11/30 0:11:27)  


一对比就发现第一行 git pull ….. 最后面少了一个 master. 于是想着在 config 文件里面加上这个 master 看看行不行.

 

修改后的配置如下:

 

[plain] view plaincopy在CODE上查看代码片派生到我的代码片

 

  1. [core]  
  2.     repositoryformatversion = 0  
  3.     filemode = false  
  4.     bare = false  
  5.     logallrefupdates = true  
  6.     symlinks = false  
  7.     ignorecase = true  
  8.     hideDotFiles = dotGitOnly  
  9. [remote “origin”]  
  10.     url = https://github.com/cncounter/translation.git  
  11.     fetch = +refs/heads/*:refs/remotes/origin/*  
  12. [branch “master”]  
  13.     remote = origin master  
  14.     merge = refs/heads/master  
  15. [remote]  
  16.     pushdefault = origin  
  17. [credential]  
  18.     helper = store  

 

需要注意的是,因为远端有多个分支,所以这个配置文件里,相应的就多了一个小节 [branch "master"],而 这个小节下面的 remote = origion, 现在加上 master 变为:

 

[plain] view plaincopy在CODE上查看代码片派生到我的代码片

 

  1. [branch “master”]  
  2.     remote = origin master  
  3.     merge = refs/heads/master   


如下图所示:

 

图片[12]-解决 TortoiseGit 诡异的 Bad file number 问题-第五维

保存,再次测试,OK,可以正常拉取:

 

[plain] view plaincopy在CODE上查看代码片派生到我的代码片

 

  1. git.exe pull -v –no-rebase –progress "origin" master  
  2.   
  3. From https://github.com/cncounter/translation  
  4. * branch            master     -> FETCH_HEAD  
  5. = [up to date]      master     -> origin/master  
  6. Already up-to-date.  
  7.   
  8. 成功 (2246 ms @ 2014/11/30 0:19:25)  


注意看到, 在第一行 git.exe pull …. 最后面多出了一个 master:

 

图片[15]-解决 TortoiseGit 诡异的 Bad file number 问题-第五维

好了,问题完美解决.[这可能是 TortoiseGit 当前版本的一个 BUG]

总结

有些日子,不适合写代码,也不适合调程序, 但适合填坑, 也许坑填的多了,时间一转,问题就解决了。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享