删除本地git版本库中受版本控制的文件
乱码原因
搜索一番,发现git文件名、log乱码,是普遍问题,这其中有编码的原因,也有跨平台的原因。主要原因是Windows 系统中的Git对中文文件名采用不同的编码保存所致。
Windows系统中使用的msysGit,采用的是系统编码来保存文件名;而Cygwin中的Git默认采用UTF-8编码来保存文件名。如果两个软件同时对一个版本库进行操作,且都认为对方是使用自己使用的编码来保存文件,就会导致文件名编码混乱,无法识别。
这就导致,如果一直使用TortoiseGit(实际调用MsysGit)提交,那么中文文件名没问题;一直使用cygwin提交,中文文件名也没问题。 但一定不能交叉使用。
分别设置 LANG、LC_CTYPE、LC_ALL 参数为同样的编码,问题依旧。
cygwin官方网站提到了非拉丁语文件名的问题,也许研究后能解决该吧: Chapter 2. Setting Up Cygwin
这里还有一篇讲解Linux系统编码文章:locale的设定及其LANG、LC_ALL、LANGUAGE环境变量的区别 。
官方终极解决方案
这个问题的官方终极解决方案,就是更新到msysGit1.7.10或更新版本。这个版本之后,msysGit和Git for Windows已经采用了UTF-8编码来保存文件名,不会再出现乱码的情况。安装和使用可参考这篇文章:使用Git、Git GUI和TortoiseGit
不幸的是,对于使用老版本msysGit提交的版本库,升级到msysGit1.7.10或者更高会出现编码问题。
有两篇文章介绍了这个问题的解决办法:
下面的文章,是历史遗留,可以不看。若希望知其所以然,则不妨观之。
乱码情景对号入座和解决方案
乱码情景1
在cygwin中,使用git add添加要提交的文件的时候,如果文件名是中文,会显示形如 274\232\350\256\256\346\200\273\347\273\223.png 的乱码。
解决方案:
在bash提示符下输入:
git config --global core.quotepath false
core.quotepath设为false的话,就不会对0x80以上的字符进行quote。中文显示正常。
乱码情景2
在MsysGit中,使用git log显示提交的中文log乱码。
解决方案:
设置git gui的界面编码
git config --global gui.encoding utf-8
设置 commit log 提交时使用 utf-8 编码,可避免服务器上乱码,同时与linux上的提交保持一致!
git config --global i18n.commitencoding utf-8
使得在 $ git log 时将 utf-8 编码转换成 gbk 编码,解决Msys bash中git log 乱码。
git config --global i18n.logoutputencoding gbk
使得 git log 可以正常显示中文(配合i18n.logoutputencoding = gbk),在 /etc/profile 中添加:
export LESSCHARSET=utf-8
乱码情景3
在MsysGit自带的bash中,使用ls命令查看中文文件名乱码。cygwin没有这个问题。
解决方案:
使用 ls --show-control-chars 命令来强制使用控制台字符编码显示文件名,即可查看中文文件名。
为了方便使用,可以编辑 /etc/git-completion.bash ,新增一行 alias ls="ls --show-control-chars"
终极解决方案
终极的解决方案是通过修改git和TortoiseGit源码实现,有网友这么做了:让Windows下Git和TortoiseGit支持中文文件名/UTF-8 ,也可以直接访问这个开源的Google项目:utf8-git-on-windows 。
如果不抗拒命令行的话,直接用Cygwin来提交Git库。因为Cygwin其实是一个在Windows平台上的模拟器,它完全模拟GNU/Linux的方式运行,所以Cygwin中的Git是采用UTF-8编码来保存中文的。
又一个“终极”解决方案(来自)(msysGit1.7.10之后,不再推荐此方案)
在操作git时,把区域设置修改为 中文GBK。这之后就可以进行git相关操作了。
在终端中跟windows保持一致
export LC_ALL=zh_CN.GBK; export LANG=zh_CN.GBK
terminal -> set charactor encoding -> gbk
切换回linux默认
export LC_ALL=en_US.utf8; export LANG=en_US.utf8
terminal -> set charactor encoding -> unicode(utf-8)
改变文件名的编码
如果已经造成乱码的恶果,还可以在utf8和gbk之间切换文件名。真的修改,而不是像上面那样修改显示的(解码的)效果。
convmv <filename> -f utf8 -t gbk
例外:convmv在fat32的U盘上运行无效,估计是fat32不允许非法编码。
git ls-files | xargs rm
运行上述指令后,手动删除 .git 目录,就可以得到一个干净未受版本控制的目录了。
上述指令有个缺点,就是空目录也会留下,没有删除,可以通过以下指令删除:
for /f "tokens=*" %a in ('dir /b /ad /s 目录路径^|sort /r') do rd "%a" /q 2>nul
上述指令为Windows 批处理指令,Linux自己搞定吧。
删除本地git版本库中受版本控制的文件的更多相关文章
- .gitignore忽略git版本库中的文件(夹)
# 忽略*.o和*.a文件 *.[oa] # 忽略*.b和*.B文件,my.b除外 *.[bB] !my.b # 忽略dbg文件和dbg目录 dbg # 只忽略dbg目录,不忽略dbg文件 dbg/ ...
- 使用 Python 操作 Git 版本库 - GitPython
GitPython 是一个用于操作 Git 版本库的 python 包, 它提供了一系列的对象模型(库 - Repo.树 - Tree.提交 - Commit等) 用于操作版本库中的相应对象. 版本库 ...
- 【原创】Git删除暂存区或版本库中的文件
0 基础 我们知道Git有三大区(工作区.暂存区.版本库)以及几个状态(untracked.unstaged.uncommited),下面只是简述下Git的大概工作流程,详细的可以参见本博客的 ...
- github在版本库中删除某个文件的所有历史记录
github的目的就是版本控制,记录每一个版本的变动.然而有的时候我们往往希望从版本库中彻底删除某个文件,不再显示在历史记录中.例如不小心上传了一堆错误的文件,或者不小心上传了帐号.密码,那么这个时候 ...
- 如何将本地项目上传到Git 版本库
1.(先进入项目文件夹)通过命令 git init 把这个目录变成git可以管理的仓库 git init 2.把文件添加到版本库中,使用命令 git add .添加到暂存区里面去,不要忘记后面的小数点 ...
- 萌新笔记——git的问题(error: object file .git/objects/* is empty...)的解决方案及对git版本库文件的了解
由于操作不当,导致git版本库出了大问题,如下所示: error: object file .git/objects/8b/61d0135d3195966b443f6c73fb68466264c68e ...
- redmine整合GIT版本库
redmine整合GIT版本库 服务器的环境: Ubuntu 11.10 64位 Redmine 1.4.5.stable.10943 git version 1.7.5.4 + gitolite ...
- GIT版本库回滚【图文版】
git 版本库回滚,在实际开发过程中总会遇得到 1. 先找出需要回滚的commitid git log -3 2. 重置本地版本库到指定commitid, 注意:本地改动将丢失 ...
- git 版本库回滚(转载)
From:http://www.cnblogs.com/qualitysong/archive/2012/11/27/2791486.html From: http://www.tech126.com ...
随机推荐
- Android DrawerLayout 高仿QQ5.2双向侧滑菜单
1.概述 之前写了一个Android 高仿 QQ5.0 侧滑菜单效果 自定义控件来袭 ,恰逢QQ5.2又加了一个右侧菜单,刚好看了下DrawerLayout,一方面官方的东西,我都比较感兴趣:另一方面 ...
- 抓包工具Fiddler的使用
Fiddler 教程 Fiddler是最强大最好用的Web调试工具之一,它能记录所有客户端和服务器的http和https请求,允许你监视,设置断点,甚至修改输入输出数据. 使用Fiddler无论对开发 ...
- javascript优化--04高质量编码
库和API的设计: 在参数设计中保持好的习惯:如顺序,width,height;top,right,bottom,left;如命名: 将undefined看作没有值而不要表示非特定的值: 在允许0,空 ...
- js:数据结构笔记1---数组
JS中数组: 只是一种特殊的对象,比其他语言中效率低: 属性是用来表示偏移量的索引:在JS中,数字索引在内部被转化为字符串类型(这也是为什么写对象属性的时候可以不叫引号),因为对象中的属性必须是字符串 ...
- OUYA设备的购买和安装
OUYA设备的购买和安装 在为OUYA这款游戏终端做具体的开发之前,建议读者先上手感受一下这款设备的游戏体验.本节所涉及的内容包括,OUYA设备的购买.安装.设置,以及最终上手开始游戏这一系列的过程本 ...
- ARP缓存表的构成ARP协议全面实战协议详解、攻击与防御
ARP缓存表的构成ARP协议全面实战协议详解.攻击与防御 1.4.3 ARP缓存表的构成 在局域网的任何一台主机中,都有一个ARP缓存表.该缓存表中保存中多个ARP条目.每个ARP条目都是由一个IP ...
- python 代码片段
print 'dongshen' for word in ['capitalize','these','words']: print word.upper() for i in range(0,5): ...
- 转载关于KeyPress和KeyDown事件的区别和联系
KeyDown:在控件有焦点的情况下按下键时发生. KeyPress:在控件有焦点的情况下按下键时发生. KeyUp:在控件有焦点的情况下释放键时发生. 1.KeyPress主要用来接收字母.数字等A ...
- COJ970 WZJ的数据结构(负三十)
WZJ的数据结构(负三十) 难度级别:D: 运行时间限制:1000ms: 运行空间限制:262144KB: 代码长度限制:2000000B 试题描述 给你一棵N个点的无根树,点和边上均有权值.请你设计 ...
- 关于TbSchedule任务调度管理框架的整合部署
一.前言 任务调度管理作为基础架构通常会出现于我们的业务系统中,目的是让各种任务能够按计划有序执行.比如定时给用户发送邮件.将数据表中的数据同步到另一个数据表都是一个任务,这些相对耗时的操作通过任务调 ...