#!/bin/bashPROJ_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
Top comments (0)
Subscribe
We're a place where coders share, stay up-to-date and grow their careers.
Top comments (0)