自动跟踪某些文件

时间:2017-07-25 14:32:27

标签: git pre-commit-hook

长话短说:我们正在使用Jupyter笔记本(.ipynb文件)并设置了Jupyter配置以保存.py份副本(àlathis answer on SO),以便更好地使用git diffs)。

因此,每次保存.ipynb文件时,都会保存.py版本,否则文件名相同。如果尚未存在.py版本,则会创建一个新版本。

是否可以自动添加/跟踪这些新创建的.py文件,可能是通过在git配置中放置一些东西?

修改

所以这可能是使用git预提交钩子,阅读它。但是,我真的不知道从头开始写一个钩子。

重申我想要的内容:我保存foo_bar.ipynb,自动创建foo_bar.py。如果我这样做,我希望预提交钩子添加foo_bar.py,例如git commit -a要强调,我不希望它添加任何旧的.py文件,只能添加与现有.ipynb文件具有相同文件名的文件。

1 个答案:

答案 0 :(得分:1)

编写一个脚本,将新的和更新的文件添加到Git并提交它们。手动运行或作为cron作业运行。更好的是,如果可能的话,将其挂钩到生成文件的工具中,以便在每次工具保存文件或退出文件时运行。

脚本可以简单如下:

# Change directory
cd /path/to/the/directory/where/the/py/files/are/saved

# Set this to 1 when a commit is needed
commit=0

# Check all the .ipynb files
for i in *.ipynb; do
    # Generate the name of the corresponding .py file
    p=${i//.ipybn}.py
    # If the .py file exists
    if [ -f $p ]; then
        # Add it to be committed; it doesn't hurt if it is not modified
        git add $p
        # Remember we have to commit at the end
        commit=1
    fi
done

# Avoid running "git commit" when nothing was staged
if [ $commit -eq 1 ]; then
    # Commit, generate an unique (not very useful) commit message.
    git commit -m "automatic commit on $(date +'%Y-%m-%d %H:%I:%S')"
fi

上面的代码假设所有.ipynb文件都存储在一个目录中(没有子目录),相应的.py文件存储在同一目录中。

如果.ipynb个文件存储在多个目录中,则将for行替换为:

for i in $(find . -name \*.ipynb); do

如果.py文件未存储在与相应.ipybn文件相同的目录中,则必须更改行p=${i//.ipybn}.py

在暂存文件之前,可以验证多个条件。