내 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
따옴표 바깥의 ~`는 이상해 보이지만 작동합니다.
첫 번째 옵션을 권장합니다.
기타 제안사항:
- 귀하의 스크립트는 bashism을 사용하지 않는 것 같으므로
/bin/sh
대신 이식 가능한 것이 더 좋습니다. 가능하지 않은/bin/bash
한 shebang 줄을 변경하고 정상적으로 스크립트하는 것이 좋습니다./bin/sh
진짜약간의 굴욕을 사용하십시오. - 날짜에 ISO 8601 형식(
%Y-%m-%d
)을 사용하면 자연스럽게 시간순으로 정렬되며 자연어 종속성의 영향을 받지 않습니다. 나는 당신도 그렇게 하도록 격려합니다. git
git 저장소를 백업하는 대신 사용을 고려할 수도 있습니다tar
. 이 목적으로 예약된 베어 저장소에 푸시할 수 있습니다. 모든 브랜치를 푸시할 수 있으며, 참조 로그에는 문제가 발생할 경우를 대비해 기록도 유지됩니다.