自动存储

时间:2008-11-17 21:18:49

标签: git version-control

链中的最后一个链接:[{3}}中的Stashing和reflog 建议经常存储以拍摄正在进行的工作的快照。作者甚至建议您可以使用cron作业定期存储您的工作,而无需手动存储。

  

藏匿的美妙之处在于它可以让您在工作中应用不显眼的版本控制   过程本身:即每天工作树的各个阶段。你甚至可以使用   如果您愿意,可以定期藏匿,例如以下快照脚本:

$ cat <<EOF > /usr/local/bin/git-snapshot
#!/bin/sh
git stash && git stash apply
EOF
$ chmod +x $_
$ git snapshot
     

没有理由不能每小时从一个cron作业运行它,以及每周或每月运行reflog expire命令。

这种方法的问题是:

  1. 如果您的工作副本没有变更,“git stash apply”将导致您的上一个藏匿点应用于您的工作副本。
  2. 执行cron作业和处理工作副本的用户之间可能存在竞争条件。例如,运行“git stash”,然后用户打开文件,然后执行脚本的“git stash apply”。
  3. 有没有人建议让这种自动存储工作更可靠?

5 个答案:

答案 0 :(得分:13)

我确实不会设置自动存储,就像那篇(优秀的)文章所描述的那样,正是因为你引用的原因。

我更喜欢使用存储,因为它是打算使用的,我故意藏匿并在我工作时应用更改。对于定期备份,我使用适当的备份解决方案。在我看来,Git不能替代备份解决方案。

答案 1 :(得分:8)

git stash实际上只是一个小shell脚本,它创建了一个未在任何分支中引用的提交。您可以在没有竞争条件的情况下模拟此行为:

#!/bin/sh
GIT_DIR=$(git rev-parse --git-dir) || exit
ref_stash=refs/stash

w_commit=$(git stash create) # creates a commit for the wip

# gather some info
head=$(git log --no-color --abbrev-commit --pretty=oneline -n 1 HEAD --)
branch=$(git symbolic-ref -q HEAD)
branch=${branch#refs/heads/}
msg=$(printf 'WIP on %s: %s' "$branch" "$head")

# Make sure the reflog for stash is kept.
: >>"$GIT_DIR/logs/$ref_stash"

git update-ref -m "$msg" $ref_stash $w_commit

脚本可能需要一些抛光,但我希望你能得到这个想法:)

答案 2 :(得分:3)

对于我的个人使用(在3年内使用它),我在别名配置部分添加了这一行:

s = !sh -c \"git stash save | grep 'No local changes to save' && git $* || (git $* && git stash pop) \"

然后,我可以通过添加's'来自动运行每个git命令。就像你的情况一样: git s snaspshot

也许为时已晚,但希望有一天会帮助某人......

答案 3 :(得分:2)

我更喜欢在藏匿管理之前进行分支管理:看看here

答案 4 :(得分:0)

为了备份,我推荐在线备份服务,类似于dropbox.com 你根本不需要做任何事情,只是跟踪你在白天为你做的所有改变。

我为所有git存储库启用了它,这可以帮助我专注于手头的实际任务。