Git đẩy chi nhánh từ điều khiển này sang điều khiển khác?


133

Tôi có các điều khiển từ xa được thiết lập:

$ git remote 
korg
rorg

Và các ngành sau:

$ git branch -a
* (no branch)
  remotes/korg/gingerbread
  remotes/korg/gingerbread-release
  remotes/korg/honeycomb
  remotes/korg/honeycomb-mr1-release
  remotes/korg/master
  remotes/m/android-2.3.3_r1 -> refs/tags/android-2.3.3_r1a
  remotes/m/gingerbread -> korg/gingerbread

Bây giờ tôi muốn đẩy tất cả các chi nhánh từ xa korgđến rorgđiều khiển từ xa. Làm thế nào để làm điều đó?

Tốt nhất là không tạo chi nhánh địa phương cho mỗi lần đầu tiên, nếu điều đó là có thể tránh được.


Tôi đoán câu trả lời cho câu trả lời này có thể so sánh với câu trả lời cho câu hỏi này: stackoverflow.com/questions/6922700/ .
Legolas

Câu trả lời:


52

Một thử nghiệm nhanh làm cho một số kho lưu trữ tạm thời cho thấy bạn có thể xây dựng một refspec có thể làm điều này:

$ git push rorg origin/one:refs/heads/one
Counting objects: 5, done.
Writing objects: 100% (3/3), 240 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
To /tmp/rorg
 * [new branch]      origin/one -> one

Vì vậy, nguồn gốc / BRANCHNAME: refs / Heads / BRANCHNAME

Kiểm tra rorgtừ xa của tôi :

pat@host /tmp/rorg (BARE:master)
$ git graph --all
* 5750bca (HEAD, master) c
| * 13fd55a (one) b
|/
* 822e0de a

5
Tại sao không git push rorg origin/one:one(không có refs/heads/) thay thế?
Ali

2
@exalted bởi vì với refs/heads/tiền tố bạn đang đẩy phân nhánh từ xa mà không cần phải thanh toán vào mộtone
HÓA ĐƠN GIỜ, NGAY LẬP TỨC

@patthoyts Tôi đã thử lệnh được đề cập, nó cho biết mọi thứ được cập nhật, nhưng tôi có 10 chi nhánh ở A và 6 chi nhánh ở xa B, vậy bạn có thể cho tôi biết làm thế nào tôi có thể di chuyển các chi nhánh bên trái không?
Keshav1234

219

Tôi đã tìm thấy cái này:

git push rorg 'refs/remotes/korg/*:refs/heads/*'

Và nó đã đẩy tất cả các chi nhánh từ xa của tôi từ korg đến rorg (ngay cả khi không có bản sao của các chi nhánh địa phương). Xem đầu ra dưới đây:

Counting objects: 293, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (67/67), done.
Writing objects: 100% (176/176), 48.32 KiB, done.
Total 176 (delta 105), reused 168 (delta 97)
remote: Resolving deltas:  11% (12/105)
To <<MY_REPOSITORY_URL>>
 * [new branch]      korg/gingerbread-> gingerbread
 * [new branch]      korg/gingerbread-release -> gingerbread-release
 * [new branch]      korg/honeycomb-> honeycomb
 * [new branch]      korg/HEAD -> HEAD
 * [new branch]      korg/honeycomb-mr1-release-> honeycomb-mr1-release
 * [new branch]      korg/master -> master

Và sau đó bạn có thể thực hiện cùng một cú hích cho tagsrefs:

git push rorg 'refs/tags/*:refs/tags/*'

2
Trong đủ mới (phiên bản nào?) Của git, đây sẽ là câu trả lời được chấp nhận. @ bjarke-freund-hansen bạn có muốn thay đổi câu trả lời được chấp nhận nếu bạn đồng ý vì lợi ích của người tìm kiếm trong tương lai không?
Jonah Graham

1
"Trong đủ mới (phiên bản nào?) Của git, đây sẽ là câu trả lời được chấp nhận" như tôi biết, điều này sẽ hoạt động cho mọi phiên bản git công khai, bởi vì các ký tự đẩy và ký tự đại diện tham chiếu là phổ biến
radistao

3
Cung cấp cho tôi Everything up-to-datetrên git 2.10.0 mà không có gì xảy ra, trong khi làm tương tự trên các nhánh riêng lẻ hoạt động.
user239558

6
Chỉ cần nghĩ rằng tôi nên gọi nó ra: phương pháp này dường như tạo ra một nhánh thực sự trên điều khiển từ xa được gọi HEAD. Nhưng điều đó có thể bị xóa. git push rorg :HEAD
Mark Stickley

1
Bất cứ ai không quen thuộc với cấu trúc refs và tự hỏi làm thế nào để đẩy các thẻ, bạn muốn lệnh này : git push rorg refs/tags/*:refs/tags/*. Điều này cũng giống như vậy git push rorg --tags, nhưng thật tốt khi hiểu những điều này đang làm gì :)
Mark Stickley

14

Để bổ sung cho câu trả lời của patthoyt , đây là tập lệnh shell ngắn đẩy tất cả các nhánh từ điều khiển này sang điều khiển khác:

SRC_REMOTE=korg
DST_REMOTE=rorg
for a in $(git branch --list --remote "$SRC_REMOTE/*" | grep -v --regexp='->')
  do git push "$DST_REMOTE" "$a:refs/heads/${a//$SRC_REMOTE\/}"
done

Để tóm tắt, đối với mỗi nhánh từ xa trên điều khiển từ xa nguồn (không bao gồm các nhánh "con trỏ" như HEAD), hãy đẩy ref đó đến điều khiển từ xa đích. ( ${a//$SRC_REMOTE\/}Bit loại bỏ tên từ xa nguồn từ tên nhánh, nghĩa là origin/mastertrở thành master.)


3
cho những người trong chúng ta cần phải làm điều đó trong một lần đẩy:git push -u $DST_REMOTE $(for a in $(git branch --list --remote "$SRC_REMOTE/*" | grep -v --regexp='->'); do echo "$a:refs/heads/${a//$SRC_REMOTE\/}"; done)
Jayen


0

Đối với bất kỳ tập lệnh nào tôi cài đặt bạn chạy, sẽ là khôn ngoan nếu bỏ qua hoặc cam kết tất cả các thay đổi của bạn.

Tôi cần phải đẩy một số chi nhánh từ điều khiển này sang điều khiển khác. Những câu trả lời yêu cầu rằng các chi nhánh địa phương tồn tại trước đó

SRC_R=origin1
DEST_R=origin2
for cbranch in $(git branch -r | grep $SRC_R | cut -d '/' -f2,3,4,5 | cut -d ' ' -f1)
do
    git checkout $cbranch
    git push $DEST_R $cbranch
done

Chỉ cần thay đổi origin1 thành điều khiển từ xa nguồn và origin2 thành điều khiển từ xa đích. Sao chép này vào "remoteBranchCloner.sh" và gọi nó bằng cách sử dụng "sh callBranchCloner.sh".

Có thể có một cách tốt hơn , đó là không thực hiện vài cú đẩy.

Nếu bạn sử dụng mã của tôi, bạn có thể muốn sử dụng bộ đệm ẩn thông tin xác thực, nếu không , bạn phải nhập thời gian máy chủ thông tin đăng nhập của bạn.

Đối với cửa sổ :

Lưu ý: Kịch bản này là dành cho linux . Nếu bạn chạy nó trong "git bash" , tập lệnh sẽ hoạt động, nhưng bạn không thể chạy nó từ bảng điều khiển gốc mà không cần cài đặt một cái gì đó đặc biệt.

git config [--global] credential.helper wincred

Dành cho linux

git config [--global] credential.helper cache

Trong đó [--global] có nghĩa là tùy chọn thêm --global

Nếu bạn muốn đặt theo dõi từ xa cho tất cả các chi nhánh thành một điều khiển từ xa mới:

DEST_R=remotename
for cbranch in `git branch`
do
    git checkout $cbranch
    git branch -u guru/$cbranch
done

Được lưu dưới dạng tệp .sh và được chạy với "sh filename.sh" sẽ đặt tất cả các luồng ngược lên để theo dõi 'remotename' từ xa


0

Do HEADnhánh bổ sung được tạo trong câu trả lời trước , cách sạch nhất mà tôi tìm thấy để làm điều này là sao chép vào một kho lưu trữ trống và sau đó đẩy tất cả các nhánh vào điều khiển từ xa như sau:

git clone --bare <from-repository>
cd <from-repo-dir>
git push --set-upstream <to-repository> --all
git push --set-upstream <to-repository> --tags
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.