2011-12-16 43 views
6

Tôi gặp vấn đề với git. Tôi có một kho lưu trữ của một dự án đang cũ và muốn bắt đầu một phiên bản mới. Tôi đã tạo một chi nhánh mới (3.0-wip) và xóa các tệp và thư mục để bắt đầu lại. Tuy nhiên, nếu tôi thanh toán chi nhánh chính của mình, các tệp và thư mục cũng sẽ biến mất khỏi đó.Duy trì cấu trúc thư mục khác nhau trong các chi nhánh git khác nhau

Làm thế nào tôi có thể có kho lưu trữ để nhánh của tôi có mọi thứ mà repo từ xa có, nhưng một thư mục làm việc hoàn toàn khác trong số 3.0-wip mà tôi có thể sửa đổi nội dung của trái tim mà không phá hủy các tệp và thư mục trong bất kỳ chi nhánh nào khác?

+0

Bạn có cam kết chi nhánh 3.0 WIP của bạn trước khi kiểm tra ra chi nhánh chủ của bạn? Nếu không, đó có thể là vấn đề. –

+0

Tôi nhân bản repo bên ngoài. Đã tạo và kiểm tra chi nhánh '3.0-wip' mới. Đã xóa các tệp/thư mục qua Trình tìm kiếm. Đã tạo tệp 'index.php' mới và đã cam kết nó. Nếu tôi thanh toán chi nhánh 'master' của mình thì các tệp vẫn biến mất và' trạng thái git' hiển thị tất cả các tệp/thư mục là 'đã xóa:'. –

+1

Bạn đã thêm git chưa. | git add -u trước cam kết của bạn? Làm cách nào bạn thực hiện những thay đổi đó trong nhánh chi nhánh của bạn? –

Trả lời

6

Cam kết thay đổi trong một chi nhánh không ảnh hưởng đến một chi nhánh khác. Bạn cũng cần phải cam kết tất cả các xóa, đó là những gì Dominic đã cố gắng giải thích. Chỉ cần thực hiện:

$ git co $NEWBRANCH 
$ git status 

Và bạn sẽ thấy hàng nghìn lần xóa không được yêu cầu. Bạn phải sử dụng git rm để xóa tệp.
Không chắc chắn git add --all cũng sẽ xử lý các xóa. Dù sao, đây là IMO không phải là cách tốt nhất để bắt đầu lại vì chi nhánh mới vẫn sẽ có lịch sử cũ.

tôi nghĩ rằng nó là tốt hơn để tạo ra một mới "disconected" cam kết:

  1. Tạo một repo mới: mkdir $DIR; cd $DIR; git init
  2. Tạo cam kết ban đầu. touch README; git add --all; git commit -m "Init"

Bây giờ đi đến để repo gốc và:

  1. Thêm nó như là một từ xa: git remote add start-anew $DIR/.git
  2. lấy nó: git fetch start-anew
  3. kéo nó trong: git co -b start-anew start-anew/master

Và voila một chi nhánh với lịch sử trống rỗng tươi.

Bạn có thể muốn xóa điều khiển từ xa, và cũng thay đổi điều khiển từ xa cho nhánh. Tôi thường chỉnh sửa .git/config theo cách thủ công, cho đến nay mà không có tai nạn.

+0

Đã cố gắng làm theo điều này, nhưng khi tôi cố gắng tìm nạp kho lưu trữ 'start-anew', tôi nhận được một lỗi" chết người: Kết thúc từ xa bị treo bất ngờ ". –

+0

Làm việc cho tôi với 'git phiên bản 1.7.6.4'? – Martian

+0

Nó làm việc cho tôi bằng cách đẩy kho 'start-anew' vào Github, và sau đó tìm nạp từ đó. Phải liên quan đến việc cố gắng tìm nạp từ máy cục bộ của tôi. –

8

Điều đang xảy ra là bạn không sử dụng git đúng cách. Hoàn toàn không có vấn đề với việc tạo ra một chi nhánh và xóa các tập tin và thư mục. Khi bạn chuyển về nhánh chính của mình, các tệp và thư mục đã xóa sẽ được khôi phục, vì chúng chưa bị xóa khỏi nhánh đó.

Điều đang xảy ra trong trường hợp của bạn là bạn đã xóa tệp/thư mục ra khỏi git, bằng cách xóa hệ điều hành, thay vì lệnh "git rm". Đó là lý do tại sao trạng thái git báo cáo chúng là "đã xóa". Đó cũng là lý do tại sao các tệp vẫn bị xóa khi bạn chuyển đổi nhánh. git đang chờ các tệp ở đó và chúng không có.

Trạng thái Git cho bạn biết chạy "git add" nhưng điều đó không hoạt động. Kể từ khi tập tin không còn ở đó, chạy git thêm sẽ không âm thầm. Bạn có thể không nhận thấy nhưng thông báo cũng cho bạn biết để chạy "git rm". Bạn có thể nghĩ rằng bạn không thể làm điều đó vì tệp đã biến mất, nhưng điều đó không đúng. Lệnh rm sẽ vẫn thành công trong việc xóa tệp khỏi repo, mặc dù bạn đã xóa nó khỏi hệ thống tệp.

Điều khác và dễ dàng hơn bạn có thể làm là chạy git add -A. Cờ -A sẽ cho biết thêm thông báo bất kỳ tệp đã xóa hoặc tệp được thêm nào.

Hãy thử điều này cho một thử nghiệm:

git init test-delete 
cd test-delete 
touch filea 
mkdir dir_b 
touch dir_b/fileb 
git add . 
git commit -m "Initial commit" 
git checkout -b new_branch 
rm -rf dir_b 
git add -A 
git commit -m "deleted files from branch" 
(ls to prove files arent' there) 
git checkout master 
(ls to show files have been restored) 
git checkout new_branch 
(ls to show files are gone again) 
Các vấn đề liên quan