Đặt vấn đề
Bạn muốn chuyển một repository sang một git server mới, và repo của bạn có quá nhiều nhánh và không thể chuyển thủ công từng nhánh một được.
Giải pháp
Ta sử dụng một bash script đơn giản để lấy toàn bộ danh sách nhánh từ remote của repo gốc (origin
), và push nó sang repo mới (dest
)
Cú pháp
Trước tiên, để thuận tiện sử dụng cho script, ta hình dung ra cú pháp mà mình sẽ sử dụng nó:
1
./sync.sh path-to-directory origin dest
Trong đó:
origin
vàdest
là 2 remote được gán vào trong repo local mà ta clone vềpath-to-directory
là đường dẫn tương đối đến thư mục chứa repo local
Bước 1: Clone repo gốc
Clone repo gốc
1
2
3
clone git://path-to-your-repo
cd your-repo
git fetch --all
Bước 2: Gán repo đích
Gán URL của repo đích vào repo local mình vừa clone về
1
git remote add dest git://path-to-your-remote-dest
Bước 3: Lấy danh sách nhánh
Lấy danh sách tên nhánh từ remote gốc, ta cần cắt phần tên remote trong tên nhánh. Ví dụ origin/master
thành master
1
git branch -r | grep -v '\->' | grep 'origin/' | sed "s/origin\///g"
Bước 4: Sync các nhánh
Thực hiện sync tất cả các nhánh, ở đây ta sẽ dùng vòng lặp while
1
2
3
4
5
6
7
8
9
10
11
function sync {
while read line
do
writeHR;
echo "Checking out $line";
git checkout $line;
git pull origin $line;
git pull dest $line;
git push dest $line;
done;
}
Script hoàn chỉnh
Từ các bước ở trên, ta có script hoàn chỉnh như sau:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#!/bin/bash
function writeHR {
echo '---------------------'
}
function sync {
while read line
do
writeHR;
echo "Checking out $line";
git checkout $line;
git pull $src $line;
git pull $dest $line;
git push $dest $line;
done;
}
cd $1;
echo "You are currently on `realpath .`"
src="$2";
dest="$3";
echo "Fetching remote: $src";
git fetch $src;
echo "Fetching remote: $dest";
git fetch $dest;
git branch -r | grep -v '\->' | grep $src/ | sed "s/$src\///g" | sync
Ở đây ta sử dụng $src
và $dest
làm tên 2 remote, 2 biến này sẽ được truyền vào từ câu lệnh gọi script
1
./sync.sh path-to-directory src-remote dest-remote
Gist: https://gist.github.com/thanhtunguet/bac5a6b6fc21a6b0ada66cc7fee1e776