2013-06-14 24 views
16

Geliştirme ortamımda klonladığım 5 repos ile çalışıyorum. Ben bir git repo güncelleştirmek istediğinizde , ben klasör/home/Adrian/repo1 girmek/ve yapın:3 Git komutlarını güncelleştirmek için bir kabuk komut dosyası hazırlayın

git ödeme ana git çekme kökenli usta

Ama sonra, her sabah yapmam gereken diğer 4 repos için aynı şey. Bu oldukça zahmetli.

Bunu bir kabuk betiğine koyabilir miyim? Yani, bu komutları kabuk betiğinde yazıp çalıştırırsam, tüm reposları güncelleyebilir miyim?

Böyle bir şey yazmaya düşünüyordum ...

cd repo1 
git checkout master 
git pull origin master 
cd .. 
cd repo2 
git checkout master 
git pull origin master 
cd .. 

(i linux kulüpler)

Düzenleme: Belki bu ne düşündüğümü daha zordur. Çoğu zaman "git asıl asıl ustası" yaptığımda, "yerel değişikliklerin .... birleşme ile üzerine yazılacağı" gibi erorrs'ları alırım. Yani ben .. İlgili şube içine girip şeyler saklamak zorunda

Düzenleme 2:

Ne bir çakışma olursa, bunu görmezden ve sonraki repo gitmek edilir yapmayı düşünüyorum

cd repo1 
git checkout master 
git pull origin master 

(if there is conflict, ignore and go to the next line but dont stop here) 

cd .. 
cd repo2 
git checkout master 
git pull origin master 
cd .. 

Ancak, parantez içinde olayı nasıl yazacağımı bilmiyorum.

+0

ne varsa Ödeme yapmaya çalıştığınızda başka şubede yapılan değişiklikler, ne zaman çekerseniz çatışmalar yaşarsınız? e prensipte yapmak istediğiniz şeyle yanlış bir şey değildir, ancak komutlarınızın neden başarısız olabileceğini (ve sonra ne yapacağınızı) düşünmeniz gerekir. – bengoesboom

+0

Evet, bunu dikkate almalıyım. Onu Düzenle’de yazdım. Prensip olarak, bir çatışma ortaya çıkarsa, saklanmalıdır. Bunun nedeni, her gece ayrılmadan önce ve eşyalarımı taahhüt ettikten sonra ve çekme reqsimi yaptıktan sonra, her şeyin düzgün ve güncellenmiş olduğunu kontrol ediyorum, ama evet, gerçekte, sabahları herhangi bir şey olabilir ve belki de bir yere gitmem gerekiyor .. – ado

+0

Sanırım her gün uzaktan takip etmeyi, 's''n'de' s''nü kullanarak bir yol izlemeyi düşünüyorsun. Gerçekten 'git' bir dvs, işinizi yerel olarak yapabilir ve basmadan önce' git pull --rebase' 'yi yayınlayabilirsiniz. Kaynağı uzaktaki kaynaktan çekecek ve değişiminizi ona uygulayacak, çatışmaya neden olabilir, ancak çözülebilir. – dyng

cevap

23

İlk olarak, recommend against using git pull.

git config --global alias.up '!git remote update -p; git merge --ff-only @{u}' 

git up ilgili açıklama için this answer bakınız: Bunun yerine, daha güvenli git up takma adı oluşturun.

Sonra yapabilirsiniz güvenle script:

#!/bin/sh 
for repo in repo1 repo2 repo3 repo4; do 
    (cd "${repo}" && git checkout master && git up) 
done 
+0

Teşekkürler! Beni ikna ettin! daha fazla gitmek yok – ado

+0

Btw inst yazmak için gerekli: ... git check out master (cd "$ {repo}" && git yukarı) .... döngü içinde? – ado

+0

@adriancdperu: Tercihlerinize/koşullarınıza bağlıdır. Şu anda kontrol edilen dalı güncellemek istiyorsanız, o zaman hayır; sadece 'master' güncellemek istiyorsanız o zaman evet. (Tüm şubelerimi bir kerede güncellemek için kullandığım bu basit 'git yukarı 'takma adının bir meraklısı sürümüm var. Bu yüzden, hiç bir zaman ödeme yapmam gerekmiyor.) –

2

Ben iş için yerel olarak teslim birçok git repo, Ben git arayacaktır tüm Repo en (bash komut güncellemek için daha ayrıntılı senaryo yazmaya karar verdik gibi derin 3 klasörlere kadar repo, Daha sonra bir git zulası yapacağız. güncellemek getirme rebase ve geri yerel değişiklikleri pop saklamak için. Komut beni pencerelerde git bash kabuk çalıştırır için.

#!/bin/bash 
# Usage: 
# ./update_git_repos.sh [parent_directory] 
# example usage: 
#  ./update_git_repos.sh C:/GitProjects/ [MAKE SURE YOU USE/SLASHES] 

updateRepo() { 
    local dir="$1" 
    local original_dir="$2" 
    cd $dir # switch to the git repo 
    repo_url=$(git config --get remote.origin.url) 

    echo "****************************************************************************" 
    echo "Updating Repo: $dir with url: $repo_url" 
    echo "Starting update in $PWD" 

    main_branch="master" 
    if [ "$repo_url" == "[email protected]:repo/repo.git" ]; then # if you have a repo where the primary branch isnt master 
     $main_branch="trunk" 
    fi 

    # update the repo, then stash any local changes 
    echo -e "\ncalling: git fetch --all && git stash" 
    (git fetch --all && git stash) 
    current_branch=$(git rev-parse --abbrev-ref HEAD) 

    # switch to master/trunk branch and rebase it, then switch back to original branch 
    if [ $current_branch != $main_branch ]; then 
     echo -e "\ncalling: git checkout $main_branch && git rebase && git checkout $current_branch" 
     (git checkout $main_branch && git rebase && git checkout $current_branch) 
    fi 

    # rebase the original branch and then stash pop back to original state 
    echo -e "\ncalling: git rebase && git stash pop on branch: $current_branch" 
    (git rebase && git stash pop) 

    #switch back to the starting directory 
    cd $original_dir 
    echo "" 
} 

directory_to_update=${1} 

if [ -z "$directory_to_update" ] ; then 
    echo "no directory passed in, using current directory" 
    directory_to_update=$PWD 
fi 
echo "Updating git repo's in directory: $directory_to_update" 
count=0 
for dir in $(find $directory_to_update -maxdepth 4 -type d -name .git | xargs -n 1 dirname); do 
    updateRepo $dir $directory_to_update #& #uncomment to make it run in multiple threads, meh 
    ((count+=1)) 
done 

echo "$count local git repos have been updated!" 
İlgili konular