2009-09-30 42 views
65

Tôi có repo @ github. Tôi đã làm một số công việc ở nhà và đẩy nó vào github. Nó liên quan đến một số xóa các tập tin và thư mục. Bây giờ tôi đang trên hộp công việc của tôi, trong đó có một bản sao của mã trước khi xóa các tập tin và thư mục.Git checkout/pull không xóa thư mục?

I ban hành như sau:.

git remote update 
git checkout HEAD 
git pull origin HEAD 

Nó xóa tất cả các file nó cần phải có, nhưng không phải là thư mục các tập tin là trong

Hai câu hỏi:

  1. Tại sao nó không loại bỏ các thư mục?
  2. Có lệnh git nào mà tôi có thể phát hành ở trạng thái hiện tại để xóa chúng không?
+0

Bạn có chắc chắn muốn HEAD không? – innaM

+0

Đồng ý, git checkout HEAD không làm gì cả, vì HEAD là một ref trỏ đến cam kết hiện đã được kiểm tra. Bạn có thể sẽ làm chủ trong cả hai trường hợp. – Cascabel

+0

Vâng, HEAD thực sự cập nhật mọi thứ ngoại trừ việc xóa các thư mục trống. Như tôi đã nói, tôi mới git. – mculp

Trả lời

132

Git không theo dõi thư mục, do đó, nó sẽ không xóa các thư mục bị trống do kết hợp hoặc thay đổi khác. Tuy nhiên, bạn có thể sử dụng git clean -fd để xóa các thư mục không được theo dõi (cờ -fd có nghĩa là f loại bỏ các tệp không được theo dõi và d irectories).

+4

Tôi đang bối rối. Vậy tại sao các thư mục bị xóa khỏi repo GitHub của tôi khi tôi cam kết/đẩy các thay đổi? – mculp

+1

Các thư mục trong bản sao làm việc của bạn có thể chứa các tệp không được theo dõi (bao gồm các tệp không được ẩn), và do đó chúng có thể trống nhưng thực sự không, vì vậy Git đã không xóa chúng. 'git clean' sẽ, dĩ nhiên. – mipadi

+0

Cảm ơn lệnh. Điều đó đã làm sạch chúng. Tuy nhiên, tôi vẫn không hiểu tại sao nó xóa các thư mục trên một cam kết/đẩy nhưng không phải trên một thanh toán/kéo. Các thư mục không chứa các tệp ẩn hoặc ẩn. – mculp

-1

Git không theo dõi các thư mục hiện tại (xem git wiki), nghĩa là bạn không thể thêm thư mục trống và cũng không xóa các thư mục bị trống. (EDIT: Cảm ơn, Manni, tôi đã sai Bạn không thể thêm thư mục rỗng, nhưng git sẽ loại bỏ thư mục trở nên trống rỗng, vì nội dung theo dõi của họ đã bị xóa !.)

Đối với lệnh để loại bỏ các thư mục trống: điều đó phụ thuộc vào hệ điều hành của bạn.

Đối với Linux bạn có thể sử dụng, ví dụ,

find -depth -type d -empty -exec rmdir {} \; 

Tuy nhiên, điều này sẽ loại bỏ tất cả thư mục rỗng!

+1

Trang wiki nói rằng git không tạo thư mục trống cho bạn. Nó ** không ** nói rằng nó sẽ không xóa các thư mục trống. Những gì mculp muốn làm việc cho tôi. – innaM

+0

@ janko, Trên thực tế, git đã không xóa được một thư mục hoàn toàn trống cho tôi. –

2

Là một phần của hầu hết các thao tác thay đổi cây làm việc (kéo, hợp nhất, thanh toán, v.v.) git sẽ xóa mọi thư mục bị trống bởi thao tác đó (tức là git đã xóa tệp cuối cùng).

git sẽ không xóa bất kỳ thư mục nào không trống hoàn toàn, vì vậy nếu bạn đã ẩn hoặc bỏ qua tệp thì chỉ vì git xóa tệp được theo dõi sau cùng không nhất thiết có nghĩa là git sẽ có thể để xóa thư mục đó. git không coi đây là tình trạng lỗi nên sẽ không phàn nàn về nó.

+0

Repo GitHub của tôi không có thư mục. Khi tôi cam kết, nó đã xóa các thư mục một cách chính xác. Tuy nhiên, khi tôi kiểm tra/kéo nó chỉ loại bỏ các tập tin. Các thư mục trống. $ ls-al tổng 8 drwxr-xr-x 2 mculp mculp 4096 23 tháng 9 15:43 ./ drwxr-xr-x 8 mculp mculp 4096 ngày 30 tháng 9 10:51 ../ – mculp

+1

Tôi không khá chắc chắn những gì bạn có nghĩa là bởi "chuyển sang HEAD để làm chủ", tôi đoán bạn có nghĩa là "' git checkout master' "nhưng hầu hết mọi người sẽ chỉ nói" Tôi chuyển sang/kiểm tra chủ ". Dù sao, khi git nói 'Đã cập nhật.' nó có nghĩa là nó không làm gì cả. git sẽ chỉ xóa các thư mục mà nó * làm cho * trống. –

+0

Từ ngữ xấu. Tôi đã thay đổi "HEAD" thành "master" như một số người đã gợi ý trong phần bình luận. – mculp

1

Git không theo dõi thư mục, tệp (có đường dẫn). Git tạo tất cả các thư mục cho những đường dẫn đó nếu chúng chưa tồn tại (cool!), Tuy nhiên nó không không xóa chúng nếu tất cả các tệp chứa trong đường dẫn được di chuyển hoặc bị xóa (không phải là mát ☹ ... nhưng có lý do).

Giải pháp (một khi bạn đã kéo/tua nhanh/sáp nhập):

git stash --include-untracked 
git clean -fd 
git stash pop 

Nếu bạn không stash trước clean, bạn sẽ mất tất cả các file untracked của bạn (không thể phục hồi).

Lưu ý: vì việc này cũng xóa tất cả các tệp bị bỏ qua, bạn có thể cần chạy lại một số tập lệnh xây dựng để tạo lại siêu dữ liệu dự án (ví dụ: ./gradlew eclipse). Điều này cũng xóa các thư mục trống và không bao giờ là một phần của đường dẫn của các tệp git.