所以,在使用git和python时,这是一个有趣的情况,我相信在其他情况下也会发生这种情况。
假设我使用文件夹/foo/创建了一个git代码库。在该文件夹中,我放置了/foo/program.py。我运行program.py,然后创建了program.pyc。我在.gitignore文件中有*.pyc,所以git不会跟踪它。
现在假设我做了另一个分支,dev。在这个dev分支中,我完全删除了/foo/文件夹。
现在我切换回主分支,/foo/再次出现。我运行program.py,program.pyc文件再次出现。平安无事。
我切换回我的dev分支。/foo/目录应该会消失。它只存在于master分支,而不存在于dev分支。然而,它仍然在那里。为什么?因为被忽略的program.pyc文件防止了文件夹在切换分支时被删除。
这个问题的解决方案是在切换分支之前递归删除所有*.pyc文件。使用这个命令我可以很容易地做到这一点。
find . -name "*.pyc" -exec rm '{}' ';'问题是,几乎每次我更换分支时都要记住这样做,这是很烦人的。我可以为这个命令创建一个别名,但是每次切换分支时,我仍然需要记住输入别名。我也可以为git-branch创建一个别名,但这也不好。除了更改分支之外,git branch命令还可以做其他事情,而且我不想每次使用它时都删除所有的pyc文件。见鬼,我甚至可以在非python代码库中使用它,然后呢?
有没有办法设置一个只在我切换分支时执行的git钩子?或者,是否有其他方法可以将所有*.pyc文件设置为在我切换分支时被擦除?
发布于 2009-10-01 15:48:42
有一个post-checkout钩子,放在.git/hooks/post-checkout中。那里可能有一个示例,可能名为.sample,也可能不是可执行文件,具体取决于您的git版本。简短描述:它有三个参数,前一个头,新头,以及一个标志,如果分支发生变化,标志为1,如果只是文件签出,则标志为0。有关更多信息,请参阅man githooks!您应该能够编写一个shell脚本来执行所需的操作,并将其放入其中。
编辑:我知道你想做这个预签出,这样签出会自动清理空的目录。但是没有预签出钩子,所以你也必须使用你的脚本来删除目录。
另请注意:别名是gitconfig的一部分,gitconfig可以是存储库的本地文件(在.git/config中,而不是~/.gitconfig中)。如果您选择使用别名(用于git-checkout,而不是git-branch),那么您可以很容易地将它们放入与python相关的存储库中。同样,在这种情况下,我会专门为此目的创建一个别名(例如,cc表示干净的签出)。如果你不想清理pyc文件,你仍然可以使用签出(或它的另一种别名形式)。
发布于 2009-11-28 02:46:39
只是复制和更新了Apreche的一个很好的解决方案,它被隐藏在评论中:
将此shell脚本保存到文件/path/to/repo/.git/hooks/post-checkout,并使其可执行。
#! /bin/sh
# Start from the repository root.
cd ./$(git rev-parse --show-cdup)
# Delete .pyc files and empty directories.
find . -name "*.pyc" -delete
find . -type d -empty -delete发布于 2014-10-12 20:54:10
另一种选择是根本不将其作为git问题来解决,而是作为Python问题来解决。您可以使用PYTHONDONTWRITEBYTECODE环境变量从一开始就阻止Python编写.pyc文件。然后,当您切换分支时,您将没有任何需要清理的东西。
https://stackoverflow.com/questions/1504724
复制相似问题