我正在一个项目中,我编辑了一些由 Git 进行过跟踪的文件。假设编辑后的跟踪文件为:
files1.py
file2.py
file3.py
所有这些文件都存在于远程存储库中。但是,我编辑了其中一个文件(说file2.py
),使其仅与我的机器兼容。因此,在提交时,我不想提交该文件(我希望此文件的远程版本保持不变)。
我知道有执行此操作的命令,例如:
来自这个link
git add
git reset --file2.py
或者从此link:
git update-index --assume-unchanged "file2.py"
但是,我想要的是在以后每次提交时都将忽略此文件,而无需每次都运行上述命令。
是否有一种类似于.gitignore
的方法可以使该文件每次提交时自动被忽略,并且始终保持远程版本不变?
答案 0 :(得分:1)
您可以使用pre-commit hook做您想做的事情:
预提交
该钩子由git-commit
调用,可以使用--no-verify
选项绕过。它不带任何参数,并且在获取建议的提交日志消息并进行提交之前被调用。从此脚本以非零状态退出会导致git commit命令在创建提交之前中止。
下面的简单代码在提交之前立即取消对file2.py
的任何更改,并拒绝创建任何新的空提交-也就是说,如果更改的唯一文件是file2.py
。
#! /bin/bash
if ! git diff-index --quiet --cached HEAD -- file2.py; then
echo Discarding file2.py changes from the index
git reset HEAD -- file2.py
if git diff-index --quiet --cached HEAD; then
echo Aborting empty commit 1>&2
exit 1
fi
fi
现在已经回答了学术问题,我建议使用另一种方法,因为该挂钩有意将控制file2.py
的两种不同样式的工作倾销给了人类用户。如果要进行手动版本控制,为什么还要使用git?
相反,让git通过将所做的更改放入单独的分支来完成其擅长的工作
git checkout --no-track -b feature/singrium origin/master
作为主服务器更改(您通过运行git fetch
赶上来)
git checkout feature/singrium
git rebase origin/master
,或者您定期将其中的变更合并到主服务器中。
git checkout feature/singrium
git merge origin/master
git rebase
和git merge
之间的区别在于它们各自产生的历史。如果您对file2.py
所做的更改很小,并且只针对少量提交进行了本地化,那么rebase方法会将这些提交作为最新修补程序之上的补丁程序保持在一起。如果您的历史记录比较笨拙,则合并可能更容易,至少在短期内如此。