• 删除本地git版本库中受版本控制的文件


     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添加要提交的文件的时候,如果文件名是中文,会显示形如 274232350256256346200273347273223.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源码目录下受版本控制(tracked files)的文件,留下未受版本控制的文件(untracker files),可以用以下指令:

    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 delete指令删除源码库根目录即可!但是千万不要提交就行了,而且用这种方式后,原来的源码目录一定不能再用做源码控制,你必须重新开启一个新目录check源码。
    对于svn就可以用这个指令:
    svn delete 源码目录
    留下的就是干净的不受版本控制的文件了,如果你有未提交的更改,还会提示你必须先提交才能删除~
  • 相关阅读:
    BZOJ 1726: [Usaco2006 Nov]Roadblocks第二短路
    BZOJ 1708: [Usaco2007 Oct]Money奶牛的硬币
    BZOJ 1642: [Usaco2007 Nov]Milking Time 挤奶时间
    BZOJ 1611: [Usaco2008 Feb]Meteor Shower流星雨
    BZOJ 1610: [Usaco2008 Feb]Line连线游戏
    BZOJ 1609: [Usaco2008 Feb]Eating Together麻烦的聚餐
    BZOJ 1607: [Usaco2008 Dec]Patting Heads 轻拍牛头
    BZOJ 1606: [Usaco2008 Dec]Hay For Sale 购买干草
    BZOJ 1083: [SCOI2005]繁忙的都市
    STL set的用法
  • 原文地址:https://www.cnblogs.com/SZLLQ2000/p/5620165.html
Copyright © 2020-2023  润新知