2011-07-12 30 views
17

Tôi sắp hoàn thành một quá trình tẻ nhạt của việc chuyển đổi "ảnh chụp nhanh" thành git. Quá trình này đã diễn ra rất tốt (nhờ có this rename process), nhưng bây giờ tôi nhận ra rằng một số chi nhánh mà tôi đã tạo ra, không xứng đáng với số branch mà là một số tag.Có một lệnh đơn giản để chuyển đổi một chi nhánh thành một thẻ không?

Vì mọi thứ vẫn là cục bộ (không bao giờ được đẩy vào kho), tôi thấy this question (và câu trả lời liên quan) hơi cồng kềnh hơn tôi thích, vì vậy tôi tự hỏi liệu mình có thể thực hiện một lối tắt thông qua một số chuyển đổi đơn giản hay không branch-to-tag "lệnh?

Có một lệnh đơn giản như vậy để chuyển đổi chi nhánh thành thẻ không?

(Tôi biết tôi chỉ có thể để nguyên trạng thái này, nhưng tôi thực sự thích cách thức gitk đánh dấu các thẻ, giúp tôi dễ dàng nhận ra chúng).

CẬP NHẬT: Nhờ câu trả lời của @ Andy bên dưới, tôi đã xoay xở để tìm ra một kịch bản trình bao làm tất cả thuận tiện và không đau đớn. Tôi chia sẻ kịch bản này vì lợi ích của tất cả và nhờ như đặc biệt với cộng đồng này vĩ đại đã khiến di chuyển cho CVS để git có thể cho tôi:

#!/bin/sh 

BRANCHNAME=$1 
TAGNAME=$2 

echo "Request to convert the branch ${BRANCHNAME} to a tag with the same name accepted." 
echo "Processing..." 
echo " " 

git show-ref --verify --quiet refs/heads/${BRANCHNAME} 
# $? == 0 means local branch with <branch-name> exists. 

if [ $? == 0 ]; then 
    git checkout ${BRANCHNAME} 
    git tag ${BRANCHNAME} 
    git checkout master 
    git branch ${BRANCHNAME} -d 
    echo " " 
    echo "Updated list branches, sorted chronologically: " 
    echo "---------------------------------------------- " 
    git log --no-walk --date-order --oneline --decorate $(git rev-list --branches --no-walk) | cut -d "(" -f 2 | cut -d ")" -f 1 
else 
    echo "Sorry. The branch ${BRANCHNAME} does NOT seem to exist. Exiting." 
fi 
+0

[Ở đây tôi đã mô tả một phương pháp hiệu quả để chuyển đổi thẻ SVN thành các thẻ git] (http://stackoverflow.com/a/20807602/815781) – Onlyjob

+0

* "Có một lệnh đơn giản ..." * - gần như không có gì trong Git rất đơn giản hoặc phù hợp với luồng công việc cơ bản, do đó người ta có thể dễ dàng trả lời câu hỏi: KHÔNG. Những gì bao giờ sau * đơn giản * không quan trọng :) – jww

Trả lời

10

Đã có sự phát triển riêng biệt bằng các chi nhánh? (Bài viết bạn liên kết đến, không xuất hiện để có sự phát triển về những chi nhánh) Nếu không có sự phát triển, bạn có thể:

  1. Thanh toán các chi nhánh git checkout branchName.
  2. Gắn thẻ với git tag tagName.
  3. Chuyển về chế độ chính git checkout master.
  4. Cuối cùng, xóa chi nhánh ban đầu với git branch branchName -d.

Điều này cũng có thể được thực hiện nếu có sự phát triển trên chi nhánh, nhưng bạn sẽ cần phải sử dụng -D thay vì -d. Mặc dù vậy, tôi không phải là chuyên gia về git, vì vậy, không chắc đó có phải là cách để rời khỏi chi nhánh của "được chấp nhận" hay không. câu trả lời

+0

Cảm ơn bạn. Không, không có sự phát triển nào trên những nhánh đó. Các 'git checkout ' và '-d' ở bước cuối cùng là những gì làm tôi sợ, nhưng bây giờ tôi hiểu rằng không có cách nào khác. Vì vậy, tôi sẽ phải thử nghiệm với điều này trên một bản sao an toàn của toàn bộ kho lưu trữ git (cục bộ). – WinWin

+1

Nếu không có sự phát triển trên nhánh đó, một thẻ là mỗi bit tốt như một nhánh (cuối cùng cả hai đều chỉ trỏ đến một cam kết). Sử dụng _little_ d sẽ đảm bảo rằng bạn có thể xóa chi nhánh một cách an toàn và không bị mất việc. – Andy

+0

Tôi vừa hoàn thành xác minh rằng quy trình 4 bước của bạn hoạt động cho tôi. Xem kịch bản shell tôi đã viết phản ánh điều đó. Cảm ơn một lần nữa và câu trả lời được chấp nhận ngay bây giờ. – WinWin

2

mỗi Andy, tôi đã thực hiện một bí danh mà cũng có thể được sử dụng để điều tương tự:

[alias] 
branch2tag = "!sh -c 'set -e;git tag $1 refs/heads/$1;git branch -D $1' -" 

Cách sử dụng

Nếu bạn muốn chuyển đổi chi nhánh lỗi-2483 để thẻ (trong khi chi nhánh chính của bạn là thạc sĩ) viết:

git branch2tag bug-2483 master 

UPDATE 1

Thay đổi để phản ánh giải pháp được đề xuất bởi kauppi.

18

Câu trả lời được đưa ra về cơ bản là chính xác.

Như thẻ và các chi nhánh chỉ là tên cho các đối tượng, có một cách đơn giản hơn mà không cần chạm khu vực làm việc hiện tại:

git tag <name_for_tag> refs/heads/<branch_name> # or just git tag <name_for_tag> <branch_name> 
git branch -d <branch_name> 

Hoặc thậm chí làm điều đó để máy chủ từ xa mà không cần chạm kho địa phương tại tất cả:

git push origin origin/<branch_name>:refs/tags/<tag_name> 
git push origin :refs/heads/<branch_name> 
+0

Ôi trời. nó đơn giản. Tôi đoán tôi over-thiết kế trong câu trả lời của tôi một chút :) – VitalyB

Các vấn đề liên quan