永久排除某些跟踪文件

Posted

技术标签:

【中文标题】永久排除某些跟踪文件【英文标题】:Exclude some tracked files from being committed permanently 【发布时间】:2019-09-21 03:07:35 【问题描述】:

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

【问题讨论】:

没有。 git update-index 是唯一的方法。更好的方法是根本不提交本地文件:***.com/search?q=%5Bgit%5D+application+configuration @phd,感谢您的评论。如何将提到的文件从跟踪更改为本地? git rm --cached file2.py 但请理解,在您推送更改后,从该存储库中提取的每个人都会删除该文件。即使您在签出不同的分支然后返回时也会删除文件。 感谢您的解释,我认为最好最安全的解决方案是使用git update-index 【参考方案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

随着 master 的变化(你可以通过运行 git fetch 赶上)

git checkout feature/singrium
git rebase origin/master

或您定期将来自 master 的更改合并到其中。

git checkout feature/singrium
git merge origin/master

git rebasegit merge 之间的区别在于它们各自产生的历史记录。如果您对file2.py 的更改很小并且本地化为少量提交,那么rebase 方法会将这些提交作为补丁保存在最新的master 之上。如果您的历史记录更笨重,合并可能会更容易,至少在短期内是这样。

【讨论】:

感谢您的解释!

以上是关于永久排除某些跟踪文件的主要内容,如果未能解决你的问题,请参考以下文章

日志文件跟踪工具

从 git 跟踪中删除文件夹

将 perforce 中未跟踪的文件夹和文件设置为可写

如何使用 git 命令行区分两个未跟踪的文本文件 [重复]

Oracle 跟踪事件 set event

如何从使用云侦探的跟踪中排除一些使用 Feign 的调用