Nếu có một kho lưu trữ mà tôi chỉ có git://
quyền truy cập (và thường chỉ cần đẩy + kéo), có cách nào để đổi tên các nhánh trong kho lưu trữ đó giống như cách tôi sẽ làm tại địa phương git branch -m
không?
Nếu có một kho lưu trữ mà tôi chỉ có git://
quyền truy cập (và thường chỉ cần đẩy + kéo), có cách nào để đổi tên các nhánh trong kho lưu trữ đó giống như cách tôi sẽ làm tại địa phương git branch -m
không?
Câu trả lời:
Bạn chỉ cần tạo một nhánh cục bộ mới với tên mong muốn, đẩy nó vào điều khiển từ xa và sau đó xóa nhánh từ xa cũ:
$ git branch new-branch-name origin/old-branch-name
$ git push origin --set-upstream new-branch-name
$ git push origin :old-branch-name
Sau đó, để xem tên chi nhánh cũ, mỗi khách hàng của kho lưu trữ sẽ phải làm:
$ git fetch origin
$ git remote prune origin
LƯU Ý: Nếu chi nhánh cũ của bạn là chi nhánh chính của bạn, bạn nên thay đổi cài đặt chi nhánh chính của mình. Mặt khác, khi bạn chạy $ git push origin :old-branch-name
, bạn sẽ gặp lỗi "xóa chi nhánh hiện tại bị cấm" .
git fetch origin --prune
(để tìm nạp các nhánh mới một cách hiệu quả và cũng loại bỏ các tham chiếu không còn trên điều khiển từ xa).
-d
hoặc --delete
thay vì :
trong các phiên bản mới hơn của git.
Nếu bạn thực sự chỉ muốn đổi tên các nhánh từ xa, mà không đổi tên bất kỳ nhánh cục bộ nào cùng một lúc , bạn có thể thực hiện việc này bằng một lệnh duy nhất:
git push <remote> <remote>/<old_name>:refs/heads/<new_name> :<old_name>
Tôi đã viết kịch bản này ( git-rename-remote-Branch ) cung cấp một lối tắt tiện dụng để thực hiện các thao tác trên một cách dễ dàng.
Là một hàm bash:
git-rename-remote-branch(){
if [ $# -ne 3 ]; then
echo "Rationale : Rename a branch on the server without checking it out."
echo "Usage : $(basename $0) <remote> <old name> <new name>"
echo "Example : $(basename $0) origin master release"
exit 1
fi
git push $1 $1/$2:refs/heads/$3 :$2
}
Để tích hợp nhận xét của @ ksrb : Điều này về cơ bản là hai lần đẩy trong một lệnh, đầu tiên git push <remote> <remote>/<old_name>:refs/heads/<new_name>
là đẩy một nhánh từ xa mới dựa trên nhánh theo dõi từ xa cũ và sau đó git push <remote> :<old_name>
xóa nhánh từ xa cũ.
git push <remote>/<old_name>:refs/heads/<new_name>
có nghĩa là đẩy một điều khiển từ xa mới sử dụng điều khiển từ xa cũ làm src, sau đó git push [space]:<old_name>
có nghĩa là xóa điều khiển từ xa cũ
refs/heads/name
? Bạn có thể chỉ sử dụng name
trực tiếp, thực hiện lệnh đầu tiên git push <remote> <remote>/<old_name>:<new_name>
?
<new_name>
chưa tồn tại. Nếu chi nhánh không tồn tại, Git yêu cầu bạn sử dụng tên đầy đủ vì nếu <new_name>
không cũng có thể đề cập đến tên thẻ.
refs/heads/<new_name>
đã tồn tại. Việc xóa vẫn thành công, dẫn đến <remote>/<old_name>
chỉ bị xóa. Một số kiểm tra trước khi bàn tay có thể dễ dàng tránh điều này.
Kiểm tra đầu tiên đến chi nhánh mà bạn muốn đổi tên:
git branch -m old_branch new_branch
git push -u origin new_branch
Để xóa một nhánh cũ khỏi remote
:
git push origin :old_branch
git push -u origin new_branch
) nếu không nhánh được đổi tên (new_branch) sẽ tiếp tục theo dõi gốc / old_branch. Và một khi bạn xóa old_branch từ xa, new_branch vẫn sẽ theo dõi nguồn gốc / old_branch, mặc dù bây giờ chi nhánh đó đã biến mất.
Chắc chắn rồi. Chỉ cần đổi tên chi nhánh cục bộ, đẩy chi nhánh mới và xóa một chi nhánh cũ.
Vấn đề thực sự duy nhất là những người dùng khác của kho lưu trữ sẽ không được đổi tên các nhánh theo dõi cục bộ.
"Đổi tên" một chi nhánh từ xa thực sự là một quá trình gồm 2 bước (không nhất thiết phải ra lệnh):
git push [space]:<old_name>
như ksrb đã giải thích );Tôi sử dụng TortoiseGit và khi lần đầu tiên tôi cố gắng xóa chi nhánh thông qua dòng lệnh, tôi đã nhận được điều này:
$ git push origin :in
gây tử vong: 'origin' dường như không phải là kho lưu trữ git
gây tử vong: Không thể đọc từ kho lưu trữ từ xa.
Vui lòng đảm bảo rằng bạn có quyền truy cập chính xác và kho lưu trữ tồn tại.
Điều này có thể là do cuộc thi không có khóa riêng được tải (mà TortoiseGit tự động tải vào cuộc thi ). Hơn nữa, tôi nhận thấy rằng các lệnh TortoiseGit không có origin
ref trong đó (ví dụ git.exe push --progress "my_project" interesting_local:interesting
).
Tôi cũng đang sử dụng Bitbucket và, như những người quản lý git trực tuyến dựa trên web khác (GitHub, GitLab), tôi có thể xóa chi nhánh từ xa trực tiếp thông qua giao diện của họ (trang chi nhánh):
Tuy nhiên, trong TortoiseGit, bạn cũng có thể xóa các nhánh từ xa thông qua Duyệt tài liệu tham khảo :
Bằng cách nhấp chuột phải vào một chi nhánh từ xa (danh sách từ xa), tùy chọn Xóa chi nhánh từ xa hiển thị:
Sau khi xóa nhánh từ xa cũ, tôi đã đẩy trực tiếp vào nhánh từ xa mới thông qua TortoiseGit chỉ bằng cách nhập tên mới vào trường Remote: của cửa sổ Push và nhánh này được tạo tự động và hiển thị trong Bitbucket .
Tuy nhiên, nếu bạn vẫn thích làm thủ công, một điểm chưa được đề cập trong chủ đề này là -u
= --set-upstream
.
Từ các git push
tài liệu , -u
chỉ là một bí danh --set-upstream
, vì vậy các lệnh trong câu trả lời của Sylvain ( -set-upstream new-branch
) và Shashank ( -u origin new_branch
) là tương đương, vì các tham chiếu từ xa mặc định làorigin
nếu không có tham chiếu nào khác được xác định trước đó:
git push origin -u new_branch
= git push -u new_branch
từ mô tả tài liệu :
Nếu cấu hình bị thiếu, nó mặc định là
origin
.
Cuối cùng, tôi đã không nhập hoặc sử dụng bất kỳ lệnh nào được đề xuất bởi các câu trả lời khác ở đây, vì vậy có lẽ điều này có thể hữu ích cho những người khác trong tình huống tương tự.
origin
. Bạn phải đặt tên cho điều khiển từ xa khi bạn nhận được nó từ việc chạy lệnh git remote
. Git hoạt động với ssh
những gì ngụ ý rằng bạn đang sử dụng khóa chung + khóa riêng. Tôi giả định rằng Autoload Putty keys
TortoiseGit chỉ tự động tải các khóa cần thiết để bạn có thể làm bất cứ điều gì với tham chiếu từ xa của bạn. Điều cuối cùng là đó git push -u
không phải là bí danh để đẩy vào một nhánh từ xa, nó là bí danh để đẩy vào một nhánh từ xa được tạo cục bộ và tham chiếu từ xa của nó chưa có nhánh này .
-u
là một bí danh --set-upstream
và "nếu cấu hình bị thiếu, nó mặc định làorigin
". Sylvain và Shashank sử dụng điều này để đẩy vào một nhánh từ xa mới được tạo . Các chủ chốt vấn đề có thể là do cuộc thi không có nó nạp khi tôi đã cố gắng git push origin :in
trên vỏ. Vì vậy, tôi không hiểu downvote của bạn, tôi chỉ chỉ ra các chi tiết của tôi và không được giải quyết trong các câu trả lời khác, giải thích chúng và giải quyết chúng.
-u
là một bí danh cho --set-upstream
nhưng đó không phải là bí danh để đẩy vào một chi nhánh từ xa như bạn đã nói. Để đẩy vào một chi nhánh từ xa mà bạn cần git push <remote>
, và nếu nó chưa ở trong điều khiển từ xa, bạn thêm vào git push -u <remote>
. Do đó, -u
được sử dụng để tạo một tham chiếu của nhánh trong điều khiển từ xa.
Tôi không biết tại sao nhưng câu trả lời của @Sylvain Defresne không phù hợp với tôi.
git branch new-branch-name origin/old-branch-name
git push origin --set-upstream new-branch-name
git push origin :old-branch-name
Tôi phải bỏ đặt ngược dòng và sau đó tôi có thể đặt lại luồng. Sau đây là cách tôi đã làm nó.
git checkout -b new-branch-name
git branch --unset-upstream
git push origin new-branch-name -u
git branch origin :old-branch-name
Tôi không biết điều này đúng hay sai, nhưng tôi đã đẩy "tên cũ" của chi nhánh sang "tên mới" của chi nhánh, sau đó xóa hoàn toàn chi nhánh cũ bằng hai dòng sau:
git push origin old_branch:new_branch
git push origin :old_branch
Bạn có thể tạo một nhánh mới dựa trên nhánh tên cũ. Chỉ cần như thế này, sau đó xóa chi nhánh cũ, hơn !!!
Thêm vào các câu trả lời đã được đưa ra, đây là phiên bản đầu tiên kiểm tra xem nhánh mới đã tồn tại chưa (vì vậy bạn có thể sử dụng nó một cách an toàn trong tập lệnh)
if git ls-remote --heads "$remote" \
| cut -f2 \
| sed 's:refs/heads/::' \
| grep -q ^"$newname"$; then
echo "Error: $newname already exists"
exit 1
fi
git push "$oldname" "$remote/$oldname:refs/heads/$newname" ":$oldname"
(kiểm tra là từ câu trả lời này )
git show-ref --quiet --verify -- refs/heads/$new_name
thay vì ls-remote | cut | sed | grep
.
git push origin origin/old_name:refs/heads/new_name && git push origin :old_name
.