LINUX.ORG.RU

Как с помощью git переносить данные из одного репозитория в другой и конвертировать кодировку?

 , , ,


0

2

Доброго времечка! Имеется репозиторий с кодом в кодировке 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`а? И да, попинайте за скрипт, укажите на глупости и как можно было бы сделать лучше.

требуется тянуть изменения из первого репозитория, попутно конвертируя кодировку

Омг, не завидую

попинайте за скрипт,

где же set -e в начале?

if [[ ! -d $cache_dir ]]; then
mkdir «$cache_dir»

В первом случае нет кавычек, либо они лишние во втором

if [[ -f $lc_file ]]; then

тоже

disarmer ★★★ ()

У git через атрибуты можно задать команду обработки файла перед записью его в working tree: filter. Тут есть пример.

xaizek ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.