我有一个项目,开发时必须将文件模式更改chmod
为777,但不应在主存储库中更改。
Git启动chmod -R 777 .
并标记所有文件为已更改。有没有办法让Git忽略对文件所做的模式更改?
我有一个项目,开发时必须将文件模式更改chmod
为777,但不应在主存储库中更改。
Git启动chmod -R 777 .
并标记所有文件为已更改。有没有办法让Git忽略对文件所做的模式更改?
Answers:
尝试:
git config core.fileMode false
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 a 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).
该-c
标志可用于为一次性命令设置此选项:
git -c core.fileMode=false diff
并且该--global
标志将使其成为已登录用户的默认行为。
git config --global core.fileMode false
全局设置的更改将不会应用于现有存储库。此外,git clone
并git init
明确设置core.fileMode
,以true
在回购的配置在讨论Git的全球core.fileMode假的克隆覆盖的地方
core.fileMode
这不是最佳做法,应谨慎使用。此设置仅覆盖mode的可执行位,而不覆盖读/写位。在许多情况下,您认为您需要此设置,因为您做了类似的操作chmod -R 777
,使所有文件都可执行。但是在大多数项目中,出于安全原因,大多数文件不需要并且不应执行。
解决这种情况的正确方法是分别处理文件夹和文件权限,例如:
find . -type d -exec chmod a+rwx {} \; # Make folders traversable and read/write
find . -type f -exec chmod a+rw {} \; # Make files read/write
如果这样做的话core.fileMode
,除非在非常罕见的环境中,您将永远不需要使用。
git config --global core.filemode false
,则只需对所有存储库执行一次此操作。
git config
命令将设置写入正确的配置文件(.git/config
仅适用于当前存储库,或者~/.gitconfig
用于--global
)。
撤消工作树中的模式更改:
git diff --summary | grep --color 'mode change 100755 => 100644' | cut -d' ' -f7- | xargs -d'\n' chmod +x
git diff --summary | grep --color 'mode change 100644 => 100755' | cut -d' ' -f7- | xargs -d'\n' chmod -x
或者在mingw-git中
git diff --summary | grep 'mode change 100755 => 100644' | cut -d' ' -f7- | xargs -e'\n' chmod +x
git diff --summary | grep 'mode change 100644 => 100755' | cut -d' ' -f7- | xargs -e'\n' chmod -x
-d'\n'
一部分,xargs
因为这是非法的论点(并且不需要)。
tr '\n' '\0'
,然后使用-0
arg到xargs以将NUL用作分隔符。
tr
太好了,事情成功了!这是OSX的完整命令:git diff --summary | grep --color 'mode change 100644 => 100755' | cut -d' ' -f7-|tr '\n' '\0'|xargs -0 chmod -x
如果要为所有存储库设置此选项,请使用该--global
选项。
git config --global core.filemode false
如果这不起作用,则可能是您使用的是git的较新版本,请尝试使用该--add
选项。
git config --add --global core.filemode false
如果您在不使用--global选项的情况下运行它,而您的工作目录不是存储库,则会得到
error: could not lock config file .git/config: No such file or directory
--add
,如git config --add --global core.filemode false
如果
git config --global core.filemode false
不适用于您,请手动执行以下操作:
cd into yourLovelyProject folder
cd到.git文件夹:
cd .git
编辑配置文件:
nano config
将true更改为false
[core]
repositoryformatversion = 0
filemode = true
->
[core]
repositoryformatversion = 0
filemode = false
保存,退出,转到上层文件夹:
cd ..
重新初始化git
git init
大功告成!
.git/config
,只需git config core.fileMode false
在项目根目录中创建一个即可。如果您编辑配置文件,则最好完全删除该指令,以便选择全局指令。
global
选项的作用与手动编辑.git / config
~/.gitconfig
,以及~/project/.git/config
)
git init
,我们是否应该将filemode设置为true?
添加到Greg Hewgill答案(使用core.fileMode
配置变量):
您可以使用--chmod=(-|+)x
的选项的git更新指数(的“混帐添加”低级别的版本)来更改索引执行权限,在那里,如果你用“git的承诺”将它拾起(而不是“git的承诺-a ”)。
您可以全局配置它:
git config --global core.filemode false
如果上述方法对您不起作用,则可能是您的本地配置覆盖了全局配置。
删除本地配置以使全局配置生效:
git config --unset core.filemode
或者,您可以将本地配置更改为正确的值:
git config core.filemode false
git config -l
(列出当前配置-本地和全局)
如果您已经使用了chmod命令,那么请检查文件的差异,它显示以前的文件模式和当前的文件模式,例如:
新模式:755
旧模式:644
使用以下命令设置所有文件的旧模式
sudo chmod 644 .
现在可以使用命令或手动在配置文件中将core.fileMode设置为false。
git config core.fileMode false
然后应用chmod命令更改所有文件的权限,例如
sudo chmod 755 .
并再次将core.fileMode设置为true。
git config core.fileMode true
为了获得最佳实践,请不要始终将core.fileMode保持为false。
For best practises don't Keep core.fileMode false always
你是什么意思,你应该解释一下。
For best practises don't Keep core.fileMode false always.
某些文件系统(例如FAT)不支持文件权限,因此OS将报告默认值(无论如何在我的系统上为766)。在这种情况下,core.filemode
在本地配置中绝对必要,除非您想通过不必要的和无意的权限更改来
core.filemode=false
则git将忽略执行位更改,无需更改本地权限。除非您已经为索引添加了权限更改,否则在这种情况下您将丢失在git add
关闭后需要执行的步骤core.filemode
。
如果要递归在配置文件(包括子模块)中将filemode设置为false:
find -name config | xargs sed -i -e 's/filemode = true/filemode = false/'
git submodule foreach git config core.fileMode false
这对我有用:
find . -type f -exec chmod a-x {} \;
或反向,具体取决于您的操作系统
find . -type f -exec chmod a+x {} \;