我有一个项目,在开发过程中,我必须将chmod的文件模式更改为777,但在主回购中不应该更改。
Git接收chmod -R 777 .并将所有文件标记为已更改。有没有办法让git忽略对文件所做的模式更改?
- 这对于在Windows上使用Git和在Windows上使用Ubuntu上的Bash非常有用。
- 对于任何只想忽略特定调用git diff的权限更改,因此不想更改其Git配置文件的人:您可以根据Zed的回答使用git diff -G.。
Try:
1
| git config core.fileMode false |
From GIT-CONGG(1):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| 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). |
可使用旗帜为一次以上的指挥官设置此选项:
ZZU1
而旗帜会使它成为用户测井的缺陷行为。
1
| git config --global core.fileMode false |
报警
这不是最好的做法,应该小心使用。此设置仅限于模式可执行位,而不包括读取/写入位。在很多情况下,你认为你需要这个设置,因为你做了一些像EDOCX1这样的事情,使你所有的可执行文件。但在大多数项目中,文件不需要也不应为安全原因而执行。
The proper way to solve this kind of situation is to handle folder and file permission separately,with something like:
1 2
| 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,你只需要做一次所有回购。
- 在我解决了这个问题之前,它对我没有作用。它应该是filemode而不是filemode。
- @tishma:git配置部分和变量名根据文档的不同不区分大小写,请参阅配置文件部分,因此如果上面的内容对您不起作用,那么它是出于另一个原因。
- @格雷格:是的。不知道出了什么问题。
- 谢谢,我正绞尽脑汁想知道我的项目发生了什么变化。一个快速的git diff告诉了我模式,您的命令忽略了它们。谢谢格雷戈
- 如果您遇到必须更改文件权限并从Windows计算机提交in-git的情况:blog.lesc.se/2011/11/how to change file premises in git.h‌&8203;tml
- 这对我不起作用:(,但是@sinan eldom给出的解决方案对我起作用。但这是每个项目的基础。全球解决方案是什么?
- 这一切都很好,但这要转到哪个配置文件?
- @donquixote:git config命令将设置写入正确的配置文件(仅针对当前存储库的.git/config或用于--global的~/.gitconfig)。
- 谢谢。为了完整性,将它添加到答案中可能会有用吗?
- @Greghewgill:这会忽略提交时的模式更改吗?从Windows保存时,Samba似乎将文件设置为+X。如果我仍要提交文件模式,将其设置为false是否会执行更新索引?还是只提交文本更改,而不提交chmod更改?谢谢!
- 如果不起作用,试试这个:git filter-branch -f --tree-filter 'find * -type f | xargs chmod 644 ' -- --all。
- 为了使这个配置生效,我不得不使用git init。
- 从损坏的Git存储库恢复后,我的文件拥有错误的权限。最好是重新设置它们,而不是让git忽略它们:find。-类型D xargs chmod 0755查找。-类型F xargs chmod 0644(stackoverflow.com/questions/14892289/…)
- 究竟是filemode还是filemode?
- @ZX1986:没关系。来自git config:"变量名不区分大小写,…"
- @Greg即使在进行全局编辑之后,如果本地配置已经将fileMode设置为true,它也不会工作。本地值将覆盖全局设置…对于每一个本地回购,我都必须转到我的机器中的每个回购,并将filemode的本地配置值更改为false。
- @格雷格,我试过了,但没能接受你的建议…因此,我联系了你。
- @谢德拉基布哦,哇,2012年的倒叙…格雷格毕竟是对的。
- "格雷戈,是的……互联网上的帖子没有有效期
- @格雷格·赫吉尔,你应该创建一个二级帐户,并把你的帖子改为感谢你自己。
- 我尝试了git config core.filemode false,并为我工作,谢谢分享。对于感兴趣的人,似乎该设置不是继承的,如果repo作为子模块包含,则应重新应用。
- 每当我初始化一个新的存储库(git init)时,新的存储库的设置都会返回到"true"。(执行git config之后--global core.filemode false)
- 为了获得在OSX和Ubuntu上工作的文件/目录权限(我得到了一个find: unknown predicate '-t'错误),我必须将其更改为:find . -type d -exec chmod 755 {} \;和find . -type f -exec chmod 644 {} \;。
- 请在此答案中添加第二个警告,说明全局设置不会应用于现有的回购!对于每个repo,您需要运行本地命令(或者看起来"git init"具有相同的效果)。这将影响几乎所有人,并且可能非常混乱(特别是当您第一次与第二个回购进行交互时,并且不知道全局设置在第一个回购上工作时为什么不工作,在第一个回购上运行全局和本地版本的设置更改)。
- @Greghewgill如果我使用git config core.sharedrepository true,那么我需要更改文件模式吗?
- 使用chmod,您只能使用+/-x tu更改文件夹的可执行位,例如,chmod +X somefile是noop,而chmod +X somedir将在该目录上设置执行位。
- 描述已经更改,现在更准确地反映了问题。
- 从这个意义上讲,fat不是"坏的",因为显然它不是为Unix设计的,所以不能存储这些权限。同样的问题也可能发生在ntfs、exfat或通过nfs安装时…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].
- --全局将只对新克隆的存储库生效。
- 非常罕见的环境=在Ubuntu和Ubuntu上流浪?:(
- 我不知道行为是否发生了变化,但是现在在clone上的per repo git配置中明确设置了core.fileMode。因此,顶部注释中建议的git config --global core.filemode false将不起作用,因为它被本地设置覆盖。
- @MTrip100与所有其他Git设置一样,本地设置仅在全局设置存在时覆盖全局设置。如果不存在,则使用全局设置。见man git-config。
- @Greghewgill当然,我只是想强调一下,与大多数其他设置(如autocrlf)不同,git二进制文件将在本地为clone上的每个repo设置core.fileMode:git clone或git init探测文件系统,以查看它是否正确处理可执行位,并根据需要自动设置此变量。
- 我可能在9876次左右回到这一行,发现这个比记住要容易得多。
- 在客户机的生产环境中,index.php文件必须是655。在dev和staging中,755。因此,我将index.php设置为655,部署到prod,dev.set file perms在dev上设置为false,dev上的权限更改为755。一个已协调的Git repo具有不同的权限!
UNDO Mode Change in Working Tree:
1 2 3 4
| git diff --summary | grep --color 'mode change 100755 => 100644' | cut -d' ' -f7- | xargs -d'
' chmod +x
git diff --summary | grep --color 'mode change 100644 => 100755' | cut -d' ' -f7- | xargs -d'
' chmod -x |
奴隶性爱分类广告
1 2 3 4
| git diff --summary | grep 'mode change 100755 => 100644' | cut -d' ' -f7- | xargs -e'
' chmod +x
git diff --summary | grep 'mode change 100644 => 100755' | cut -d' ' -f7- | xargs -e'
' chmod -x |
- 在os x lion上,省略xargs中的-d'
'部分,因为这是一个非法论点(不需要)。
- 可以忽略"chmod:在"+x"后面缺少操作数"的任何错误。
- pascal:d""是处理带有嵌入空格的文件名所必需的;普通的xargs在空白处拆分。
- 这是最新的吗?我在明格里听到"chmod:论点太少"
- @pascal@pimlottc-d将分隔符指定为换行符,而不是任何空白。BSD xargs没有这个选项,但是您可以将输出通过tr '
' '\0'进行管道传输,然后使用-0arg到xargs,使用nul作为分隔符。
- 对我来说,它给了埃多克斯1〔2〕。
- 适用于"正确"的文件名,但在文件名中有空格时失败(ipython笔记本)。我怎么能理解?
- 太酷了,江户十一〔三〕的事情成功了!这是OSX的全部命令:git diff --summary | grep --color 'mode change 100644 => 100755' | cut -d' ' -f7-|tr '
' '\0'|xargs -0 chmod -x
- grep --color如何帮助?
如果你想把这个选项留给你所有的休息,使用--global选项。
1
| git config --global core.fileMode false |
如果这不适合你的话,可能用一个新版本的GIT,所以尝试--add
1
| git config --add --global core.filemode false |
如果你没有这个选择,你的工作目录就不是一个反馈,你会得到
1
| error: could not lock config file .git/config: No such file or directory |
- 在Git版本1.7.9.6(Apple Git-31.1)上不适用于我
- 看起来Git后来使用了--add,就像在git config --add --global core.filemode false中一样。
- 如果repo的本地配置已经具有filemode=true,那么更改全局配置将不会有帮助,因为本地配置将覆盖全局配置。必须更改机器每个回购的本地配置一次
- 请:用syedrakib的警告更新这个答案!在我找到它之前,一切都感觉很疯狂,之后一切都变得很有意义。
if
1
| git config --global core.fileMode false |
Does not work for you,do it manually:
1
| cd into yourLovelyProject folder |
CD Into Git Folder:
编辑文件:
改变真相
1 2 3
| [core]
repositoryformatversion = 0
filemode = true |
->
1 2 3
| [core]
repositoryformatversion = 0
filemode = false |
Save,exit,go to upper folder:
重新开始
你真行!
- 不要编辑.git/config,只需在项目根目录中添加一个简单的git config core.fileMode false就足够了。如果编辑配置文件,最好完全删除该指令,这样全局指令就会被接收。
- -1如果git-config--global不起作用,这意味着您没有在系统级别执行此操作的权限,删除global选项与手动编辑.git/config完全相同。
- @Charlesb不正确-答案提供了一种解决方法,将选项直接放入项目中,使其特定于项目。这将不适用于您以后制作/签出的其他Git项目,但适用于您正在处理的项目。(让我们确保消除~/.gitconfig和~/project/.git/config的歧义)
- 一旦运行了git init,我们应该将filemode设置回true吗?
Adding to Greg Hewgill answer(of using EDOCX1&2).config variable:
您可以使用GIT更新索引(GIT add的低水平版本)的选项,以更改索引中的执行许可,如果您使用GIT commit(而不是GIT commit-a),则从哪里取出。
- 这应该被编辑成格雷格·休吉尔的答案,而不是作为一个单独的答案添加,从而创建一个具有单一明确表示的最高答案。
- @格雷格:一个人需要有足够的分数来编辑自己的答案;我想当时我没有足够的编辑权限。
- @Jakub我认为您现在已经有了足够的声誉:)对于一个示例文件,这个命令会是什么样子的?
你可以配置它
法国电力公司
如果上面没有为你工作,原因可能是你的本地配置超越了全球配置。
远程您的本地配置以实现全球配置的效果:
法国电力公司
另一方面,您可以将您的本地配置改变为右值:
法国电力公司
- 如果主要答案对你没有帮助-试试这个。如果要检查本地配置而不修改它,请检查git config -l(列出当前配置-本地和全局)
如果您使用了CHMOD命令,在检查文件的不同时,它会显示前置文件模式和当前文件模式,例如:
新模式:755
老时尚
使用下游命令设置所有文件的旧模式
法国电力公司
现在设置核心.filemode to false in confile either using command or manually.
1
| git config core.fileMode false |
然后应用Chmod命令改变所有文件的权限,例如
再一次设置核心,为真实的模式。
1
| git config core.fileMode true |
For best practices don't keep core.filemode false always.
- 您是说整个项目(在开发、阶段和生产中)应该是755吗?
- @丹尼尔:没有。只更改必要文件的模式。
- 你什么意思,你应该解释一下。
- For best practises don't Keep core.fileMode false always.某些文件系统(例如fat)不支持文件权限,因此操作系统将报告一个默认值(766)。在这种情况下,core.filemode在本地配置中是绝对必要的,除非您想用不必要和无意的权限更改来膨胀提交历史记录。
- 还有,你干嘛还要把烫发换回去呢?如果设置core.filemode=false,那么git将忽略执行位更改,不需要更改本地权限。除非您已经添加了对索引的权限更改,在这种情况下,在关闭core.filemode之后,您将缺少需要执行git add的步骤。
- 我想知道如果我有这种情况(使用修改的权限),然后使用git config core.fileMode false,会发生什么。设置此项后,某些文件将不会被视为已修改(仅具有权限更改的文件),但其他具有超出权限的其他更改(例如有效的代码修改等)仍将被视为因代码更改而被修改。如果我提交这些文件,那么mod更改也将作为其中的一部分提交吗?
- @Rajaehtesham没有,尽管你可能已经知道了。提交的唯一内容是您准备提交的内容(即,您git add的文件,以及运行git status时看到的更改)。
By defining the following alias(in ~/.gitconging)you can easily temporarily disable the filemode per git command:
1
| nfm ="!f(){ git -c core.fileMode=false $@; };f" |
当这个别名预定给GIT指挥部时,文件模式的改变不会以其他方式显示出来。For example:
如果你想设置Filemot to false in confiles recursively(including subbodules):法国电力公司
- 如果该行不在配置文件中,这将不起作用。如果要更改子模块,请尝试以下操作:git submodule foreach git config core.fileMode false
简单的解决办法
这个简单的评论在项目文件中(它不会改变你的原始更改).它只会改变你改变项目文件允许时所做的改变
Comment is below:
配置核心.filemode false
为什么所有不需要的文件都要修改:因为你改变了项目折叠许可评论Sudo Chmod-R 777./Yourprojectfolder
你什么时候才能改变你没有做的事?你在下面找到了不同的文件
MGX1〔0〕
This works for me:
1
| find . -type f -exec chmod a-x {} \; |
或反向,取决于你的操作系统
1
| find . -type f -exec chmod a+x {} \; |
- 这将更改文件的权限,但不会使git忽略文件的权限。