Git 从永久提交中排除某些跟踪文件

Git 从永久提交中排除某些跟踪文件,git,repository,Git,Repository,我在一个项目中编辑了一些被Git跟踪的文件。假设编辑的跟踪文件是: files1.py file2.py file3.py 所有这些文件都存在于远程存储库中。但是,我编辑了其中一个文件(说file2.py),使其仅与我的机器兼容。因此,在提交时,我不希望提交此文件(我希望此文件的远程版本保持不变)。 我知道有这样的命令: 由此 或者从这个: git更新索引——假设“file2.py”未更改 但是,我希望在以后每次提交时都忽略此文件,而不是每次都运行上面的命令。 是否有类似于.gitignore

我在一个项目中编辑了一些被Git跟踪的文件。假设编辑的跟踪文件是:

files1.py
file2.py
file3.py
所有这些文件都存在于远程存储库中。但是,我编辑了其中一个文件(说
file2.py
),使其仅与我的机器兼容。因此,在提交时,我不希望提交此文件(我希望此文件的远程版本保持不变)。
我知道有这样的命令:
由此

或者从这个:
git更新索引——假设“file2.py”未更改

但是,我希望在以后每次提交时都忽略此文件,而不是每次都运行上面的命令。

是否有类似于
.gitignore
的方法使此文件每次提交时自动被忽略,并始终保持远程版本不变

您可以通过使用:

预提交
此钩子由调用,可以使用
--no verify
选项绕过。它不接受任何参数,在获取建议的提交日志消息并进行提交之前被调用。以非零状态退出此脚本会导致git commit命令在创建提交之前中止

下面的简单代码在提交之前立即取消显示对
file2.py
的任何更改,并拒绝创建任何新的空提交-也就是说,如果唯一更改的文件是
file2.py

#/bin/bash
如果!git diff index--quiet--cached HEAD--file2.py;然后
回显放弃索引中的file2.py更改
git重置头--file2.py
如果git diff index——quiet——缓存头;然后
回送中止空提交1>&2
出口1
fi
fi
既然学术问题已经得到了回答,我建议使用一种不同的方法,因为钩子故意将控制两种不同风格的
file2.py
版本的工作推回到人类用户身上。如果您想进行手动版本控制,为什么要使用git呢

相反,让git通过将您的更改放在单独的分支中来完成它擅长的工作

git签出-无磁道-b功能/singrium origin/master
随着主机的变化(您可以通过运行
git fetch
来实现这一点)

git签出功能/singrium
git重新基址源/主
或者定期将来自主服务器的更改合并到其中

git签出功能/singrium
git合并源/主

git-rebase
git-merge
之间的区别在于它们各自产生的历史记录。如果您对
file2.py
所做的更改很小,并且只局限于少量提交,那么重基方法会将这些提交作为补丁放在最新的主文件之上。如果您的历史记录更难处理,那么合并可能会更容易,至少在短期内是这样。

没有。
git更新索引是唯一的方法。更好的方法是根本不提交本地文件:@phd,谢谢你的评论。如何将所提到的文件从跟踪更改为本地?但请理解,在您推动更改后,从该存储库中提取的每个人都将删除该文件。即使你签出另一个分支,然后返回,也会删除文件。谢谢你的解释,我认为最好和最安全的解决方案是使用
git update index
谢谢你的解释!
git add
git reset --file2.py