2009-03-17 36 views
12

Tôi sử dụng git để giao tiếp với một kho lưu trữ SVN. Tôi có một số chi nhánh git cho các dự án khác nhau tôi làm việc trên.luồng công việc git và C++, cách xử lý đối tượng và tệp lưu trữ?

Bây giờ, bất cứ khi nào tôi chuyển từ nhánh này sang nhánh khác bằng cách sử dụng 'git checkout', tất cả tệp thi hành và tệp đối tượng được biên dịch từ nhánh trước vẫn ở đó. Điều tôi muốn thấy là việc chuyển từ nhánh A sang B dẫn đến một cây với tất cả các tệp đối tượng và tệp nhị phân từ lần cuối cùng tôi làm việc trên chi nhánh B.

Có cách nào để xử lý điều này mà không cần tạo nhiều kho lưu trữ git ?

Cập nhật: Tôi hiểu rằng tệp thực thi và nhị phân không được kết thúc trong kho lưu trữ. Tôi hơi thất vọng trong thực tế rằng tất cả các công cụ phân nhánh trong git là vô ích đối với tôi, vì nó quay ra tôi sẽ phải sao chép kho git proxy của mình cho mỗi nhánh mà tôi muốn bắt đầu. Một cái gì đó tôi đã làm cho SVN và hy vọng tránh được với git. Tất nhiên, tôi không phải làm điều đó, nhưng nó sẽ khiến tôi làm một việc mới hầu hết thời gian sau khi chuyển đổi giữa các chi nhánh (không vui).

+0

Bạn nên kiểm chi nhánh khác nhau để thư mục khác nhau, hoặc tôi nhận được của bạn câu hỏi sai? – schnaader

+0

Tại sao bạn muốn thực thi và nhị phân trong kiểm soát nguồn ở tất cả? – n0rd

+0

Như được chỉ ra trong một câu trả lời một giải pháp tốt là xây dựng trong một thư mục riêng biệt mà nguồn là. Nhưng nhân bản kho lưu trữ git địa phương thực sự nhanh chóng, vì vậy nó có thể không phải là xấu. – Ismael

Trả lời

9

Điều bạn muốn là ngữ cảnh đầy đủ, không chỉ chi nhánh ... mà là nói chung là nằm ngoài phạm vi cho công cụ kiểm soát phiên bản. Cách tốt nhất để làm điều đó là sử dụng nhiều kho lưu trữ.

Đừng lo lắng về sự thiếu hiệu quả của điều đó mặc dù ... Hãy lưu trữ thứ hai của bạn một bản sao của người đầu tiên. Git sẽ tự động sử dụng liên kết để tránh có nhiều bản sao trên đĩa.

Dưới đây là một hack để cung cấp cho bạn muốn, bạn muốn

Vì bạn có thư mục obj riêng biệt, bạn có thể sửa đổi Makefiles của bạn để làm cho vị trí cơ sở năng động sử dụng một cái gì đó như thế này:

OBJBASE = `git branch --no-color 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1\//'` 
OBJDIR = "$(OBJBASE).obj" 
# branch master: OBJBASE == "master/", OBJDIR == "master/.obj" 
# non-git checkout: OBJBASE == "", OBJDIR == ".obj" 

Đó sẽ nhưng tên chi nhánh của bạn vào OBJBASE, mà bạn có thể sử dụng để xây dựng vị trí objdir thực tế của bạn. Tôi sẽ để nó cho bạn sửa đổi nó để phù hợp với môi trường của bạn và làm cho nó thân thiện với người dùng không git của Makefiles của bạn.

1

Những tệp đó không được Git hoặc Subversion theo dõi, vì vậy chúng sẽ bị bỏ lại một mình với giả định rằng chúng là một số sử dụng cho bạn.

Tôi chỉ thực hiện các lần kiểm tra trong các thư mục khác nhau. Tiết kiệm cho tôi những rắc rối của việc dọn dẹp.

6

Đây không phải là git hoặc svn cụ thể - bạn nên có trình biên dịch của bạn và các công cụ khác trực tiếp đầu ra của tệp trung gian như .o tệp vào thư mục không nằm trong kiểm soát phiên bản.

+0

Thực tiễn tiêu chuẩn này có phải không? Hiện tại cây của chúng tôi được chia thành các thư mục src riêng biệt cho mỗi mô-đun có kèm theo thư mục obj và lib. Bất kỳ gợi ý về cách làm điều này khác nhau (theo một cách tiêu chuẩn)? –

+1

Nó không thực sự quan trọng ở đâu trong cây chúng miễn là nội dung bị loại trừ khỏi sự kiểm soát bởi các cơ chế như svn: ignore –

+2

Điều này sẽ không làm cho các tệp đối tượng khớp với thanh toán của anh ta. Anh ấy đang cố gắng tránh 'làm sạch' khi thay đổi chi nhánh. –

3

Bạn có thể đặt trình biên dịch IDE để tạo tất cả các tệp tạm thời riêng tư (.class và vv) trong <output>\branchName\....

Bằng cách định cấu hình chi nhánh thiết lập biên dịch theo chi nhánh, bạn có thể đăng ký tên chi nhánh trong đường dẫn thư mục đầu ra.

Bằng cách đó, ngay cả khi các tệp riêng tư vẫn còn khi bạn git checkout, dự án của bạn trên nhánh mới đã sẵn sàng hoạt động.

3

Trong thư mục contrib/ của phân phối git, có một tập lệnh được gọi là git-new-workdir cho phép bạn thanh toán nhiều nhánh trong các thư mục khác nhau mà không nhân bản kho lưu trữ của bạn.

0

Làm sạch sẽ không cần thiết vì các tệp khác nhau giữa các nhánh khác nhau được kiểm tra với ngày thực tế !!!

Điều này có nghĩa là nếu Makefile của bạn là chính xác, chỉ những tệp đối tượng, libs và tệp thực thi mới được biên dịch lại thực sự thay đổi do thanh toán. Đó là lý do chính xác một makefile là có ở nơi đầu tiên.

Trường hợp ngoại lệ là nếu bạn cần chuyển đổi các tùy chọn trình biên dịch hoặc thậm chí các trình biên dịch trong các nhánh khác nhau. Trong trường hợp đó có lẽ git-new-workdir là giải pháp tốt nhất.

5

Để giữ nhiều lần kiểm tra cùng một kho lưu trữ, bạn có thể sử dụng git --work-tree. Ví dụ,

mkdir $BRANCH.d 
GIT_INDEX_FILE=$BRANCH.index git --work-tree $BRANCH.d checkout $BRANCH 
0

Nếu thực thi biên soạn là các tập tin đã được kiểm tra trong
sau đó stash git giải quyết vấn đề.

[compile] 
git stash save "first branch" 
git checkout other_branch 
[Fiddle with your code] 
[compile] 
git stash save "second branch" 
git checkout first_branch 
git stash apply [whatever index your "first branch" stash has] 
# alternatively git stash pop [whatever index...] 

Nếu thực thi biên soạn là các tập tin chưa và sẽ không được kiểm tra trong
sau đó chỉ cần thêm chúng vào .gitignore

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