2010-07-21 23 views
161

Tôi có kho lưu trữ trống được sử dụng làm cửa hàng trung tâm cho dự án của mình. Tất cả các nhà phát triển làm git clone <repo> để chia sẻ với nó. Khi họ làm bản sao, họ nhận được thanh toán chi nhánh chính (trừ khi họ làm git clone -n) vì repo.git/HEAD chứa ref: refs/heads/master, làm cho chi nhánh hoạt động hoạt động này.Git: Cách đúng để thay đổi Active Branch trong kho lưu trữ trống?

Câu hỏi là, làm cách nào để thay đổi Active Branch đúng cách? Tôi chỉ có thể hack trực tiếp tập tin repo.git/HEAD, nhưng điều đó có vẻ khó chịu và, tốt, hacky.

Tôi đã thử thực hiện git checkout <otherbranch> trong thư mục repo .git, nhưng điều đó không thành công vì tôi không ở trong một cây làm việc.

tôi đã cố gắng git update-ref HEAD refs/heads/otherbranch nhưng điều đó chỉ được cập nhật refs/con/tổng thể để được giống như refs/heads/otherbranch (okay, tôi đã là một trong một kho lưu trữ giả, không phải là một sản xuất của tôi!)

tôi đã cố gắng git update-ref --no-deref HEAD refs/heads/otherbranch và gần như đã hoạt động. Nó cập nhật tệp HEAD, nhưng nó đặt nó thành SHA1 của cam kết được trỏ đến bởi refs/heads/otherbranch.

Tôi đang thử nghiệm với phiên bản git 1.7.0.2.msysgit.0.

Tôi đoán không có cách nào để thực hiện điều này thông qua git push, vì cho phép tất cả và tạp phẩm thay đổi nhánh mặc định của bạn có vẻ hơi không an toàn (!), Nhưng chắc chắn có cách tốt hơn để thực hiện trong thư mục repo .git trực tiếp hack tập tin HEAD.

+0

IMO bạn chỉ đang cố gắng thực hiện Điều sai ở đây. Nếu bạn muốn nhánh mặc định là cái gì đó không phải là master, thì nhánh đó cần phải là master. Ngoài ra, hãy sử dụng hai kho lưu trữ khác nhau. –

+10

Làm thế nào về cơ bản là cố gắng làm điều sai trái ở đây? Một kho trống hỗ trợ nhiều nhánh. Tôi sử dụng một kho lưu trữ trống như là back-up cho kho lưu trữ cục bộ của tôi, và như vậy phản ánh các nhánh. Tôi có một bậc thầy về cả hai và một chi nhánh phát triển trên cả hai. Nếu tôi muốn xem nhật ký của nhánh phát triển trên kho lưu trữ trống, tôi phải hack các tệp - có vẻ như git về cơ bản là sai ở đây liên quan đến hỗ trợ kho lưu trữ trần. – Cthutu

+11

@NicholasKnight IMHO bạn về cơ bản là sai ở đây. Không có gì đặc biệt về "master" như một tên chi nhánh, nó chỉ là một mặc định. Trong các kho lưu trữ mà chúng tôi không có chi nhánh chính, vì "chính" không có ý nghĩa đối với công ty. Bất cứ khi nào chúng tôi thực hiện bản phát hành, chúng tôi tạo một chi nhánh bảo trì mới với số bản phát hành mới và chỉ định đó làm chi nhánh đang hoạt động. – Spacemoose

Trả lời

235

Nếu bạn có quyền truy cập vào các repo trần từ xa, article suggests này:

git symbolic-ref HEAD refs/heads/mybranch 

nào sẽ cập nhật các tập tin ĐẦU trong kho của bạn để nó có chứa:

ref: refs/heads/mybranch 

như được ghi lại trong số git-symbolic-ref


Nếu bạn không có quyền truy cập vào repo từ xa, hãy xem my previous answer.


Hãy nhớ rằng một lệnh như git remote set-head:

  • không thay đổi chi nhánh mặc định của xa repo.
    Nó chỉ thay đổi một chi nhánh theo dõi từ xa lưu trữ trong địa phương repo của bạn như refs/remotes/<name>/HEAD

  • không thay đổi HEAD bản thân (một lần nữa, chỉ refs/remotes/<name>/HEAD), vì vậy cần phải git symbolic-ref.

Vì vậy git remote set-headkhông câu trả lời ở đây.
git symbolic-ref HEAD là, nếu bạn có quyền truy cập trực tiếp vào repo từ xa.

+3

Cảm ơn! Tôi có quyền truy cập trực tiếp vào repo trần từ xa để git-symbolic-ref sẽ thực hiện công việc. Tôi thích thủ thuật không phổ biến tổ tiên được đề cập trên các chủ đề khác, mặc dù - chắc chắn một cho ngăn kéo phía dưới. Tôi đã dành tuổi cho Googling nhưng không thể tìm thấy câu trả lời trước của bạn, nhưng "git remote head master" tìm thấy thứ hạng cao thứ hai, ngay dưới git-remote (1). Kỳ lạ. Chỉ cần đi để cho thấy khó khăn như thế nào là tìm một cái gì đó khi bạn không biết chính xác những gì bạn đang tìm kiếm. – kbro

+0

'git symbolic-ref HEAD refs/heads/mybranch' làm việc tốt cho tôi! CẢM ƠN! ;) – vinzenzweber

+1

Tôi thực sự đánh giá cao câu hỏi này, bởi vì tôi vô tình kiểm tra một nhánh * khác * so với chủ và bây giờ tôi phải sửa lỗi đó. –

-4

Tôi đã so sánh hai thư mục trước và sau khi áp dụng

git symbolic-ref HEAD refs/heads/mybranch

và dường như chỉ tập repo.git/HEAD đã thay đổi như vậy có lẽ nó là khá an toàn chỉ để "hack" các tập tin.

+2

Có những vấn đề phá vỡ tinh vi có thể được giới thiệu bằng cách chỉnh sửa trực tiếp các tệp tin Git ref. Tôi khuyên bạn nên chống lại điều đó. Các lệnh hệ thống ống nước dễ dàng hơn và an toàn hơn so với chỉnh sửa trực tiếp các thông số. –

+2

Ưu điểm của @boryn này là gì? –

+2

Git theo dõi rất nhiều thứ trong nền như lịch sử của các lần chỉnh sửa. Nếu bạn thay đổi tệp theo cách thủ công thì tệp sẽ không được ghi nhật ký. Đúng là nó có thể không thành vấn đề. Nhưng nếu bạn mất dấu vết của một số cam kết và muốn tìm chúng, bạn sẽ hạnh phúc hơn nếu bạn không chỉ "hack" tập tin. – qwerty9967

0

Ngoài ra, nếu bạn không có quyền truy cập vào kho trần, bằng cách thực hiện một git remote set-head và bạn đã làm xong

Xem trước response

-3

này tôi cũng có một repo trần trên máy chủ của chúng tôi và đã có thể để truy xuất thành công các tệp bằng cách sử dụng

git clone //server/repo/directory -b branch_name 

vào một kho lưu trữ cục bộ mới mặc dù manpage cho biết đây chỉ dành cho kho không trống.

+1

Trong khi những gì bạn nói là đúng, thực tế là bạn đang sử dụng -b để chọn một nhánh cụ thể làm hỏng câu trả lời của bạn trong ngữ cảnh câu hỏi của tôi, đó là cách bạn đặt nhánh DEFAULT. – kbro

0

Để thay đổi nhánh bạn cần thay đổi tham chiếu HEAD thành chi nhánh bạn muốn sử dụng.

danh sách đầu tiên tất cả các tài liệu tham khảo trong kho trần bằng cách làm

$find ref 

Sau đó tìm tài liệu tham khảo cho chi nhánh của bạn, định dạng sẽ như sau refs/heads/<my_branch>. Vì vậy, bước tiếp theo là kiểm tra tham chiếu hiện tại, chỉ cần nhập:

$git symbolic-ref HEAD 

để bạn biết nhánh hiện tại sau đó cập nhật khi cần.

$git sumbolic-ref HEAD ref/heads/<my_branch> 

Thant của nó. Thưởng thức.

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