git - checkout 新分支时自动删除 *.pyc 文件和其他空目录

标签 git python bash

所以这是使用 git 和 python 时的一个有趣的情况,我相信它也会发生在其他情况下。

假设我创建了一个带有文件夹/foo/的 git repo。在那个文件夹中,我放了/foo/program.py。我运行 program.py 并创建了 program.pyc。我在 .gitignore 文件中有 *.pyc,所以 git 不会跟踪它。

现在假设我创建了另一个分支,开发者。在这个 dev 分支中,我完全删除了/foo/文件夹。

现在我切换回 master 分支,/foo/重新出现。我运行 program.py 并且 program.pyc 文件重新出现。一切都很好。

我切换回我的开发分支。/foo/目录应该消失。它只存在于 master 分支中,而不存在于 dev 分支中。但是,它仍然存在。为什么?因为被忽略的program.pyc文件防止了切换分支时文件夹被删除。

解决这个问题的方法是在切换分支前递归删除所有*.pyc文件。我可以用这个命令轻松做到这一点。

find . -name "*.pyc" -exec rm '{}' ';'

问题在于,几乎每次我更改分支时都必须记住这样做很烦人。我可以为这个命令创建一个别名,但是我仍然必须记住每次更改分支时都要输入它。我也可以为 git-branch 取一个别名,但这也不好。 git branch 命令除了只是更改分支之外,还做其他事情,我不想每次使用它时都删除所有 pyc 文件。哎呀,我什至可以在非 python 存储库中使用它,然后呢?

有没有办法设置一个只在我更改分支时执行的 git 钩子(Hook)?或者是否有其他方法可以将所有 *.pyc 文件设置为在我切换分支时被删除?

最佳答案

有一个 post-checkout 钩子(Hook),放置在 .git/hooks/post-checkout 中。那里可能有一个示例,可能名为 .sample 或可能不可执行,具体取决于您的 git 版本。简短描述:它获取三个参数,前一个 HEAD、新 HEAD 和一个标志,如果分支发生更改,则为 1,如果只是文件 checkout ,则为 0。请参阅 man githooks 了解更多信息!您应该能够编写一个 shell 脚本来执行您需要的操作并将其放在那里。

编辑:我知道您希望在 checkout 前执行此操作,以便 checkout 自动清理变空的目录。但是,没有预 checkout Hook ,因此您也必须使用脚本来删除目录。

另一个说明: 别名是 gitconfig 的一部分,它可以是存储库的本地(在 .git/config,而不是 ~/.gitconfig)。如果您选择使用别名(对于 git-checkout,而不是 git-branch)执行此操作,您可以轻松地将它们仅放在与 python 相关的存储库中。同样在这种情况下,我会专门为此目的创建一个别名(例如 cc 用于 checkout 清洁)。如果您不想清理 pyc 文件,您仍然可以使用 checkout(或其他别名形式)。

关于git - checkout 新分支时自动删除 *.pyc 文件和其他空目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1504724/

相关文章:

git - 当 git rebase 两个具有共享历史的分支时,是否有一种简单的方法可以让共同的历史保持共同?

linux -/usr/bin/包含 & 符号的 bash 脚本的时间

bash - reg for . 中的双反斜杠和单斜杠有什么区别?

linux - 检测目录中是否有内容被修改,如果是,则备份 - 否则什么都不做

git - 我无法让 Git 在 DOS SHELL 中使用 Vim——它说 "cannot run sh"

terminal - git命令前的 "bang"或 "!"是什么意思?

git - 如何将 clang-formatting 添加到预提交 Hook ?

python - 适用于 Windows 的 gstreamer python 绑定(bind)

python - django 缓存函数是否会生成模板

python - pkg_resources.resource_stream 在 python3 上失败