解决 TortoiseGit 诡异的 Bad file number 问题

问题描述

昨天,以及今天(2015-4-25),使用 TortoiseGit 时碰到了一个诡异的问题. 卸载,清理注册表,重装,重启,各类折腾之后,仍是不能解决. 可是11.24一过,忽然灵光一闪,解决了.git

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

 

[plain]  view plain copy 在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).ide

 

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

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

 

[plain]  view plain copy 在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 按钮,便可打开这个文件,以下图所示:

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

 

[plain]  view plain copy 在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 @ 2015/04/25 0:11:27)  


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

 

修改后的配置以下:命令行

 

[plain]  view plain copy 在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 plain copy 在CODE上查看代码片 派生到个人代码片
 
  1. [branch "master"]  
  2.     remote = origin master  
  3.     merge = refs/heads/master   


以下图所示:code

 

保存,再次测试,OK,能够正常拉取:

 

[plain]  view plain copy 在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 @ 2015/04/25 10:30:25)  


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

 

 

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

相关文章
相关标签/搜索