2012-08-13 9 views
5

W przypadku, gdy repozytorium ma wiele oddziałów: w jaki sposób można po prostu zaktualizować plik we wszystkich gałęziach.Jak zaktualizować plik we wszystkich gałęziach repozytorium Git

W tym przypadku jest to plik podobny do bashrc, który określa niektóre zmienne środowiskowe. W przeszłości zaktualizowałem wersję master branch, a następnie przerzuciłem każdą gałąź. Jest to pewnego rodzaju obciążenie na poziomie n + 1, którego chciałbym uniknąć.

+2

Nie możesz. Skryptuj, odwiedzając każdy oddział po kolei i zmieniając (lub skopiuj gdzieś) plik na nich. Możesz uniknąć sprawdzania, biorąc dokładnie ten sam obiekt Git, który popełniłeś w pierwszej gałęzi (pracującej? Master?), Jeśli dobrze jest ** wziąć dokładnie taką samą zawartość pliku. – fork0

+0

Myślę, że lepiej byłoby napisać scenariusz do przekierowania. Narzut jest taki sam bez względu na to, czy plik zostanie przekopiowany czy skopiowany w każdym oddziale. Dlaczego więc nie mieć czystej historii bez zduplikowanych wiadomości i zestawów zmian? –

Odpowiedz

3

Aby przedłużyć fork0 „s comment, trzeba połączyć:

Ie:

#!/bin/bash 
branches=() 
eval "$(git for-each-ref --shell --format='branches+=(%(refname))' refs/heads/)" 
for branch in "${branches[@]}"; do 
    if [[ "${branch}" != "master" ]]; then 
    git checkout ${branch} 
    git checkout master -- yourFile   
    fi 
done 

(To jest dostosowane do twojego przypadku, ponieważ tutaj zawsze kasuje plik z gałęzi master.)

2

Myślę, że trochę się spóźniło, ale pomoże ci poniższy skrypt.

#!/bin/bash 

if [ $# != 1 ]; then 
    echo "usage: $0 <filename>" 
    exit; 
fi 

branches=`git for-each-ref --format='%(refname:short)' refs/heads/\*` 
curr_branch=`git rev-parse --abbrev-ref HEAD` 
# echo "curr_branch:"$curr_branch 

filename=$1 
file_in_repo=`git ls-files ${filename}` 

if [ ! "$file_in_repo" ]; then 
    echo "file not added in current branch" 
    exit 
fi 

for branch in ${branches[@]}; do 
    if [[ ${branch} != ${curr_branch} ]]; then 
     git checkout "${branch}" 
     git checkout "${curr_branch}" -- "$filename" 
     git commit -am "Added $filename in $branch from $curr_branch" 
     echo "" 
    fi 
done 
git checkout "${curr_branch}" 
+0

Interesujące podejście również. +1 – VonC

+0

Pamiętaj o sprawdzeniu niezamówionych zmian w bieżącym repo. Dodałem później, aby sprawdzić, czy nie ma zmian lokalnych w bieżącym oddziale. ** status git - pliki bezużyteczne = nie - szybko ** –

Powiązane problemy