Git操作之 - 文件模式修改

本文介绍如何在Ubuntu Git环境下,避免Windows系统修改代码文件时自动添加可执行属性。通过理解gitconfig的fileMode设置,指导读者如何将它设置为false,确保提交时不包含不必要的权限变化。

平时工作中,经常是在Ubuntu虚拟机下使用Git管理代码。

同时为了方便编辑,在Ubuntu上架设了Samba服务器,这样就能在Windows上访问Git代码并进行编辑。

但由于Ubuntu和Windows的文件系统操作不同,一个本来是仅有读写属性的源码文件,在Windows上修改后,就自动加上了可执行属性。

文件修改前:

$ ll mySrc.cpp

-rw-rw-r-- 1 shawn shawn 0 3月  24 09:57 mySrc.cpp

文件修改后:

$ ll mySrc.cpp

-rwxrw-r-- 1 shawn shawn 1 3月  24 09:57 mySrc.cpp*

这时如果不小心进行了提交,就会把文件的可执行属性一并提交到服务器。

一旦被爱挑毛病的老板发现,后果你懂的。

那如何能避免这个问题呢?

在git的功能设计中,已经考虑到了这种情况,在git config中有相应的设置项,如下所示,查询当前的设置项的值:

$ git config core.fileMode

true

当fileMode选项为true时,就会发生如上所述问题。我们只需把fileMode改为false即可。

$ git config core.fileMode false

注意:

执行git config时要在当前的repository内,这时配置的是local setting。

在repository之外,可以配置global或system setting。

$ git config --global core.fileMode false

$ git config --system core.fileMode false

附, 在git帮助文档中关于fileMode的说明:

core.fileMode

           Tells Git if the executable bit of files in the working tree is to be honored.

           Some filesystems lose the executable bit when a file that is marked as executable is checked out, or checks out an non-executable file with executable bit on.  git-clone(1) or git-init(1)

           probe the filesystem to see if it handles the executable bit correctly and this variable is automatically set as necessary.

           A repository, however, may be on a filesystem that handles the filemode correctly, and this variable is set to true when created, but later may be made accessible from another environment

           that loses the filemode (e.g. exporting ext4 via CIFS mount, visiting a Cygwin created repository with Git for Windows or Eclipse). In such a case it may be necessary to set this variable

           to false. See git-update-index(1).

           The default is true (when core.filemode is not specified in the config file).

<think>好的,用户想了解Git中'git reset-- .'和'gitreset --hard'的区别。首先我需要回忆reset的不同模式,比如--soft、--mixed、--hard的区别。根据引用[2],--mixed会重置HEAD和索引,而--hard还会重置工作目录。用户提到的这两个命令都属于reset的不同用法。接下来,分析'gitreset --.'。这的'.'通常表示当前目录,可能是指定路径。根据Git文档,当使用路径时,reset只会影响索引中的特定文件,不会移动HEAD。这应该属于mixed模式,默认是--mixed,所以这个命令的作用是将暂存区的文件恢复到HEAD版本,但工作目录保持不变。用户需要明确路径的作用。 然后看'git reset--hard',根据引用[2]和[4],--hard会重置HEAD、索引和工作目录,所有未提交的更改都会被丢弃。这包括暂存和非暂存的修改,比较危险,如引用[1]提到的gitcheckout--<file>的危险性类似。需要比较两者的主要区别:一个影响特定路径的暂存区,另一个影响整个项目且彻底丢弃更改。同时,用户可能混淆了路径和模式参数的不同组合。要确保解释清楚命令的结构,比如'git reset[mode] [commit] [path]'的格式,其中模式缺省是--mixed,路径的存在会限制reset的范围。 另外,用户可能在实际使用中遇到误操作,需要强调--hard的风险,如引用[1]警告的不可逆操作。同时,可能涉及gitrestore的相关命令,如引用[1]中的git restore--staged和gitrestore,与reset的区别也需要简要说明。最后,生成相关问题时要围绕reset的不同模式、使用场景、恢复方法等,帮助用户深入理解。</think>### Git reset命令的核心区别解析 #### 1. `git reset -- .` 的功能解析 - **路径限定作用**:`.`表示当前目录,该命令仅作用于当前目录及子目录下的文件 - **默认模式**:使用`--mixed`模式(默认行为),会重置**暂存区(index)**状态到HEAD版本,但**保留工作目录的修改** - **典型场景**:误将不需要的文件`git add`后,想要撤销暂存状态但保留工作目录修改时使用 - **等价命令**:`git restore --staged .`(引用[1]) $$ \text{操作范围} = \begin{cases} \text{HEAD位置不变} \\ \text{暂存区回退到HEAD} \\ \text{工作目录保留修改} \end{cases} $$ #### 2. `git reset --hard` 的功能解析 - **全局重置**:同时重置**HEAD指针**、**暂存区**和**工作目录** - **数据风险**:会永久丢弃所有未提交的修改(包括暂存区和工作目录) - **典型场景**:彻底放弃当前分支的所有修改,恢复到某个干净的历史状态 $$ \text{操作范围} = \begin{cases} \text{HEAD移动到目标commit} \\ \text{暂存区回退到目标commit} \\ \text{工作目录完全同步} \end{cases} $$ #### 3. 核心差异对比表 | 特征 | `git reset -- .` | `git reset --hard` | |----------------------|-------------------------|-------------------------| | **HEAD位置变化** | 不移动 | 根据参数移动 | | **暂存区修改** | 重置到HEAD | 重置到目标commit | | **工作目录修改** | 保留 | 完全丢弃 | | **路径限定支持** | ✔️(仅影响指定路径) | ❌(全局操作) | | **数据风险等级** | 低 | 高(引用[1]警告) | #### 4. 典型工作流示例 ```bash # 场景1:误添加多个文件后仅撤销暂存 $ git add . $ git reset -- . # 暂存区清空,工作目录保留修改 # 场景2:彻底回退到上一个commit $ git reset --hard HEAD~1 # 所有修改丢失(引用[4]) ``` #### 5. 安全操作建议 - 使用`git stash`临时保存工作进度 - 优先尝试`git restore`命令(引用[1]) - 执行`--hard`前用`git diff HEAD > backup.patch`创建补丁备份
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夜流冰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值