#!/bin/bash
PROJ_ROOT_DIR="$(dirname "$(dirname "$(readlink -f "$0")")")"
echo "Project directory: $PROJ_ROOT_DIR"
PROJ_ROOT_DIR_PARENT="$(dirname "$PROJ_ROOT_DIR")"
TIMESTAMP=$(date +%Y%m%d_%H%M_%S_%3N)
cd "$PROJ_ROOT_DIR"
# ########
echo ">>> $(date +%Y%m%d_%H%M_%S_%3N) start pack to svn code "
BACKUP_OLD_SVN_CODE_DIR="$PROJ_ROOT_DIR_PARENT/_backup/old_svn_code/$TIMESTAMP"
mkdir -p "$BACKUP_OLD_SVN_CODE_DIR"
SVN_DIR="$PROJ_ROOT_DIR_PARENT/_svn/test_rsync"
####################################
# #### @method[git archive]:
if false; then
GIT_TEMP_DIR=$(mktemp -d)
git archive HEAD | tar -x -C "$GIT_TEMP_DIR/"
rsync -aivhP \
--delete \
--backup --backup-dir="$BACKUP_OLD_SVN_CODE_DIR" \
--exclude='.svn/' \
"$GIT_TEMP_DIR/" \
"$SVN_DIR/"
rm -rf "$GIT_TEMP_DIR"
fi
# @pros:
# - use git archive, reliable and deterministic for git user.
# @cons:
# - local source code **file modification time are all changed**.
# - zip and unzip is slow.
# - need tmp folder.
# - re-copy every single file every time (because file modification time is changed).
# @note:
# - you cannot **only** update the file modification time afterwards,
# `rsync -rt --existing ./ "$PROJ_ROOT_DIR/rsync_out/"` will not work, it will update the whole file, slow.
# #### @method[rsync + gitignore]:
if false; then
rsync -aivhP \
--delete-after \
--backup --backup-dir="$BACKUP_OLD_SVN_CODE_DIR" \
--include='**.gitignore' \
--exclude='/.git/' \
--filter=':- .gitignore' \
--filter='protect /.svn/' \
. "$SVN_DIR/"
fi
# @pros:
# - directly uses rsync, no git involved, only .gitignore is needed.
# @cons:
# - **unable to recognize negation** , eg: the `!imp.log` after `*.log` will still be ignored.
# - if a file is added to .gitignore **later**, it will **not be deleted** from the svn code, cuz its ignored now.
# #### @method[rsync + git ls-files]:
if false; then
git ls-files -zc | rsync -aivhP --delete --backup --backup-dir="$BACKUP_OLD_SVN_CODE_DIR" \
--from0 --files-from=- \
--filter='protect /.svn/' \
. "$SVN_DIR/"
fi
# @pros:
# - use git ls-files instead of telling rsync to parse gitignore
# @cons:
# - **unable to do deletion**
# - base on the current local file in the project, not the git committed HEAD.
# @note:
# - tried `--delete-excluded --exclude='*' --delete-missing-args`, just wont work.
# #### @method[rsync + git ls-files + tmp + link-dest]:
# @recommend:
TMP_GIT_PROJ_SOURCE_CODE_DIR="$PROJ_ROOT_DIR_PARENT/_tmp/git_proj_source_code/$TIMESTAMP"
mkdir -p "$TMP_GIT_PROJ_SOURCE_CODE_DIR/"
git ls-files -c
git ls-files -zc |
rsync -aivhP \
--from0 --files-from=- \
--link-dest="$SVN_DIR/" \
"./" "$TMP_GIT_PROJ_SOURCE_CODE_DIR/"
rsync -aivhP \
--delete \
--backup --backup-dir="$BACKUP_OLD_SVN_CODE_DIR" \
--filter='protect /.svn/' \
--link-dest="$TMP_GIT_PROJ_SOURCE_CODE_DIR/" \
"$TMP_GIT_PROJ_SOURCE_CODE_DIR/" "$SVN_DIR/"
rm -r "${TMP_GIT_PROJ_SOURCE_CODE_DIR:?}/"
# @pros:
# - use git ls-files, reliable.
# - solve most of those problems above.
# - fast, utilize rsync and link-dest with hard link.
# @cons:
# - base on the current local file in the project, not the git committed HEAD.
# - need tmp folder.
# - complex, still not single line rsync command.
####################################
# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
# @warning:
# - I did test the code before, but made minor modification later without testing again.
# @comment,sum:
# - the whole problem was due to:
# - rsync has poor support for delete with files-from.
# - rsync has poor support for gitignore.
# - if those problems were solved, we could have use simpler single line rsync command.
# project parent dir structure:
#
# _backup
# _backup\old_svn_code
# _backup\old_svn_code\20250728_1231_10_755
# _backup\old_svn_code\20250728_1237_35_271
#
# _svn
# _svn\test_rsync
# _svn\test_rsync\bb
# _svn\test_rsync\cc
# _svn\test_rsync\scripts
# _svn\test_rsync\.gitignore
#
# _tmp
# _tmp\git_proj_source_code
#
# test_rsync
# test_rsync\.git
# test_rsync\bb
# test_rsync\bb\b1.log
# test_rsync\bb\b1.txt
# test_rsync\bb\b2.log
# test_rsync\bb\b2.txt
# test_rsync\bb\imp.log
# test_rsync\cc
# test_rsync\cc\c1.txt
# test_rsync\cc\c2.txt
# test_rsync\scripts
# test_rsync\scripts\proj_pack_and_sync.sh
# test_rsync\.gitignore
# test_rsync\test_rsync.code-workspace
# @reference:
# rsync --delete --files-from=list / dest/ does not delete unwanted files - Stack Overflow
# https://stackoverflow.com/questions/1813907/rsync-delete-files-from-list-dest-does-not-delete-unwanted-files?rq=4
#
# git - rsync exclude according to .gitignore & .hgignore & svn:ignore like --filter=:C - Stack Overflow
# https://stackoverflow.com/questions/13713101/rsync-exclude-according-to-gitignore-hgignore-svnignore-like-filter-c
For further actions, you may consider blocking this person and/or reporting abuse
Top comments (0)