zoukankan      html  css  js  c++  java
  • 删除本地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 源码目录
    留下的就是干净的不受版本控制的文件了,如果你有未提交的更改,还会提示你必须先提交才能删除~
  • 相关阅读:
    hive与hbase整合
    待重写
    hive DML
    【知识强化】第六章 总线 6.1 总线概述
    【知识强化】第五章 中央处理器 5.1 CPU的功能和基本结构
    【知识强化】第四章 指令系统 4.3 CISC和RISC的基本概念
    【知识强化】第四章 指令系统 4.2 指令寻址方式
    【知识强化】第四章 指令系统 4.1 指令格式
    【知识强化】第三章 存储系统 3.6 高速缓冲存储器
    【知识强化】第三章 存储系统 3.5 双口RAM和多模块存储器
  • 原文地址:https://www.cnblogs.com/SZLLQ2000/p/5620165.html
Copyright © 2011-2022 走看看