Доброго времечка! Имеется репозиторий с кодом в кодировке cp1251, так сделал не я, но приходится с этим мириться. Есть репозиторий с этим же кодом в кодировке utf-8. Во втором репозитории код мигрирует на другую БД, но требуется тянуть изменения из первого репозитория, попутно конвертируя кодировку. С наскока, дело решилось скриптом:
#!/bin/bash
# ======================= Repository urls =====================================
source_repo_url="ssh://git@tratata:7434/thesystem/thesystem-cp1251.git"
destination_repo_url="ssh://git@tratata:5344/thesystem/thesystem.git"
# =============================================================================
# Get repository name from url
function get_repository_name()
{
[[ $1 =~ \/([^\/]*)\.git ]]
echo ${BASH_REMATCH[1]}
}
echo "-> Source repository url: $source_repo_url"
echo "-> Destination repository url: $destination_repo_url"
# Get working directory path
dirname=$(dirname $(readlink -e $0))
# Check cache directory exists
cache_dir="$dirname/cache"
if [[ ! -d $cache_dir ]]; then
mkdir "$cache_dir"
fi
# Download data from source repository
echo "-> Downloading data from source repository..."
repo_name=$(get_repository_name $source_repo_url)
repo_dir="$cache_dir/$repo_name"
cd $cache_dir
# If local repository already exists, then delete it
if [[ -d $repo_dir ]]; then
rm -rf $repo_dir
fi
git clone "$source_repo_url"
cd $repo_dir
# Check last commit id
lc_file="$cache_dir/.last_commit_id"
lc_from_repo=`git log --format="%H" -n 1`
if [[ -f $lc_file ]]; then
lc_from_file=`cat $lc_file`
if [ "$lc_from_file" == "$lc_from_repo" ]; then
echo "No need to update! Done."
exit
fi
fi
# Convert files encoding
extensions=(php js css html txt)
for ext in ${extensions[@]}; do
find -name "*.$ext" -print0 | while IFS= read -r -d '' file; do
tmp_name="${file}.utf8"
echo "Converting \"$file\" to \"$tmp_name\"..."
iconv -f cp1251 -t utf8 "$file" > "$tmp_name"
echo "Deleting original file..."
rm -f "$file"
echo "Moving temporary to original file destination..."
mv "$tmp_name" "$file"
done
done
# Upload data to destination repository
echo "-> Uploading data to destination repository..."
git remote set-url origin "$destination_repo_url"
git commit -a -m "Auto update. Commit id: $lc_from_repo, datetime: `date +"%Y-%m-%d %H:%M:%S"`"
git pull -s recursive -X theirs --no-edit
git push
# Go back to cache directory and remove local repository
echo "Removing local repository..."
cd ..
rm -rf $repo_dir
# Write last commit id into file
echo $lc_from_repo > $lc_file
echo "-> Done."
Есть ли более изящные варианты решения задачи? Может быть встроенные механизмы git`а? И да, попинайте за скрипт, укажите на глупости и как можно было бы сделать лучше.