我正在尝试创建一个 shell 脚本,它将备份我的 git 代码库并保存在具有当前名称的特定备份目录中
到目前为止我有:
#!/bin/bash
branch="master"
if [ $# -eq 1 ]
then
branch=$1
fi
workspace="~/GIT_Workspace/my_project/"
timestamp=$(date +%d_%b_%Y)
filename="~/GIT_Workspace/Back/$timestamp-$branch.tar.gz"
echo "*** Updating branch: $branch ***"
#git -C "$workspace" checkout "$branch"
#git -C "$workspace" fetch origin
#git -C "$workspace" pull origin "$branch"
echo "*** Saving to file $filename"
tar -zcvf "$filename" "$workspace"
我无法创建 tar 文件,并且总是失败并出现以下错误:
tar: Failed to open '~/GIT_Workspace/Back/10_Mar_2015-master.tar.gz'
有什么帮助吗?
答案1
在下面几行中,
workspace="~/GIT_Workspace/my_project/"
filename="~/GIT_Workspace/Back/$timestamp-$branch.tar.gz"
~
不会扩展到您的主目录,因为它在引号内。它需要在引号之外才能扩展。因此,您的脚本正在尝试打开一个以文字~
字符开头的文件,该文件当然不存在。
选项:
variable="$HOME/GIT_Workspace"
。我们经常避免~
在脚本中完全使用,而$HOME
没有任何充分的理由使用 ,除了波浪线扩展通常被认为是一种交互式功能,最好不要以非交互方式使用。 (不好的理由,但你就在那里......)variable=~/GIT_Workspace
根本没有引用。然而,我们通常尝试在脚本中非常努力地使用引用,而不是在交互式使用中,因为你永远不知道什么时候有人会出现并提供其中包含空格的参数或参数,然后需要引用。防御性编程。variable=~"/GIT_Workspace" with the
引号外的 ~` 看起来很奇怪,但会起作用。
我推荐第一个选项。
其他的建议:
- 您的脚本似乎没有使用任何 bashisms,因此它最好在可移植
/bin/sh
而不是/bin/bash
.我鼓励您更改 shebang 行并通常编写脚本,/bin/sh
除非您可以真的利用一些羞辱。 - 如果您对日期使用 ISO 8601 格式 (
%Y-%m-%d
),那么它们自然会按时间顺序排序,并且不受自然语言依赖性的影响。我鼓励你也这样做。 git
您可能会考虑使用而不是备份 git 存储库tar
。您可以推送到为此目的而保留的裸存储库。您可以推送所有分支,并且引用日志也会保留历史记录,以防出现错误。