排除某些跟踪文件无法永久提交

时间:2019-05-02 14:52:30

标签: git repository

我正在一个项目中,我编辑了一些由 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的方法可以使该文件每次提交时自动被忽略,并且始终保持远程版本不变?

1 个答案:

答案 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 rebasegit merge之间的区别在于它们各自产生的历史。如果您对file2.py所做的更改很小,并且只针对少量提交进行了本地化,那么rebase方法会将这些提交作为最新修补程序之上的补丁程序保持在一起。如果您的历史记录比较笨拙,则合并可能更容易,至少在短期内如此。