【问题标题】:Is there a way to watch a .git folder, and update my git log whenever it changes?有没有办法查看 .git 文件夹,并在它发生变化时更新我的​​ git 日志?
【发布时间】:2018-07-03 20:34:09
【问题描述】:

我一直在尝试创建一个自动更新的git log --graph --no-pager。我使用fswatch 取得了一些进步,但我遇到了我的 git 历史实际上比我的屏幕显示的更大的问题。我尝试添加| head -n $((`tput lines` - 1)),但由于换行,输出仍然溢出。然后我尝试使用tput rmam 来禁用换行,但现在我通常看不到HEAD 指向的位置。

有人可以帮助我吗?理想情况下,我想删除 --no-pager,但我不知道如何使用 fswatch。这是我目前所拥有的:

function gwatch() {
  tput rmam
  location=$(git rev-parse --show-toplevel)
  clear;
  git --no-pager graph --color | head -n $((`tput lines` - 1));
  tput smam

  fswatch -or $location/.git | while read MODFILE
  do
    tput rmam
    clear;
    git --no-pager graph --color | head -n $((`tput lines` - 1));
    tput smam
  done
}

【问题讨论】:

  • cron 作业。 0 * * * * cd /path/to/repo; git log --graph --no-pager > logfile 每小时运行一次。
  • ...什么?我不明白 cron 工作在这里会有什么帮助......
  • 既然可以盲目地每小时记录一次,为什么还要设置观察者?
  • ...这不是我要求的...

标签: git bash unix zsh fswatch


【解决方案1】:

我有一个不如你的优雅但简单的解决方案:使用 watch

watch -n 1  "sh -c 'git log | head -n $(tput lines)'"

watch 将为您进行分页,但您将无法浏览日志。

但如果你想这样,你可以使用下面的代码:

#!/bin/bash

gitwatch()
{
    while true; do
        sleep 3
        fswatch -xr $location/.git/objects | while read events; do
            if echo $events | grep -q Created; then
                pid=$(pgrep -t $(ps -o tty= -p $$) $PAGER)
                kill $pid
                break
            fi
        done
    done
}

location=$(git rev-parse --show-toplevel)

gitwatch &

while true; do
    git log
done

我放了一个 sleep 因为我们在 git 的一次修改中创建了多个文件。这段代码需要一个更好的解决方案来捕捉 git 中的修改,而不是查看所有 git 对象!

您可以使用-o --event=Created,而不是-xgrep 以及已创建。但是,这种方法响应速度较慢,而且似乎并非一直有效。

【讨论】:

  • 这就是 -o 标志对 fswatch 所做的事情!它只用一个通知替换多个通知,并计算发生了多少更改!让我试一试,我会让你知道结果如何! :)
  • 请问pid 线路是如何工作的?对我来说,这似乎只是一堆神秘的咒语。大声笑
  • 使用-o 响应速度较慢,但​​我会在我的答案中添加它。带有pid 的行尝试在同一个tty 中找到进程PAGER 的pid。在这种情况下,tty 命令不起作用。
猜你喜欢
  • 2016-06-27
  • 2012-08-14
  • 2012-06-10
  • 1970-01-01
  • 2021-06-24
  • 1970-01-01
  • 1970-01-01
  • 2018-10-24
  • 1970-01-01
相关资源
最近更新 更多