Git checkout / pull không xóa thư mục?


82

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

Tôi đã phát hành như sau:

git remote update
git checkout HEAD
git pull origin HEAD

Nó đã xóa tất cả các tệp mà nó nên có, nhưng không xóa các thư mục chứa các tệp đó.

Hai câu hỏi:

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

Đồng ý, HEAD thanh toán git không làm gì cả, vì HEAD là một tham chiếu trỏ đến cam kết thanh toán hiện tại. Bạn có thể sẽ là chủ trong cả hai trường hợp.
Cascabel 30/09/09

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 sử dụng git.
mculp 30/09/09

Có thể có bản sao của Làm cách nào để buộc "git pull" ghi đè lên các tệp cục bộ? Vui lòng kiểm tra câu trả lời ở đó nếu bạn vẫn muốn một số giải pháp khác nhau.
DrBeco

Câu trả lời:


151

Git không theo dõi các thư mục, vì vậy nó sẽ không loại bỏ những thư mục trở nên trống do hợp nhất hoặc thay đổi khác. Tuy nhiên, bạn có thể sử dụng git clean -fdđể loại bỏ các thư mục untracked (các -fdphương tiện cờ f loại bỏ các tập tin Orce untracked và d irectories).


4
Tôi bối rối. Sau đó, tại sao các thư mục bị xóa khỏi kho GitHub của tôi khi tôi cam kết / đẩy các thay đổi?
mculp 30/09/09

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 chưa được kiểm tra (bao gồm các tệp chưa được kiểm tra ẩn) và do đó chúng có thể trống nhưng thực sự không phải vậy, vì vậy Git đã không xóa chúng. git cleantất nhiên sẽ.
mipadi 30/09/09

4
Nó có thể liên quan đến thực tế là các kho lưu trữ GitHub là kho lưu trữ trống (chúng không có các bản sao hoạt động), nhưng cục bộ của bạn thì có. Tôi tưởng tượng nếu bạn sao chép một kho lưu trữ mới từ nguồn gốc GitHub, bạn sẽ không có những thư mục đó.
mipadi 30/09/09

18
Nhưng tất nhiên, hãy chạy lệnh với -n(chạy khô) thay vì chạy -ftrước tiên, để bạn có thể thấy những gì sắp bị xóa. Đặc biệt là vì git clean -dloại bỏ không chỉ những thư mục hấp dẫn mà còn cả các tệp không được theo dõi.
Todd Owen,

2
@EliGolin: git cleankhông xóa các tệp được liệt kê trong .gitignore trừ khi bạn vượt qua -xtùy chọn.
mipadi

4

Là một phần của hầu hết các hoạt động thay đổi cây làm việc (kéo, hợp nhất, kiểm tra, v.v.), git sẽ xóa bất kỳ thư mục nào được làm trống bởi hoạt động đó (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 hoàn toàn trống, vì vậy nếu bạn có tệp ẩn hoặc bị bỏ qua thì chỉ vì git xóa tệp được theo dõi cuối cùng khỏi thư mục đó 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à một điều kiện lỗi nên sẽ không phàn nàn về nó.


Kho GitHub của tôi không có các thư mục. Khi tôi cam kết, nó đã loại bỏ 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ỉ xóa các tệp. Các thư mục trống. Tổng $ ls -al 8 drwxr-xr-x 2 mculp mculp 4096 23 tháng 9 15:43 ./ drwxr-xr-x 8 mculp mculp 4096 30 tháng 9 10:51 ../
mculp

1
Tôi không chắc ý của bạn khi "chuyển HEAD sang master", tôi cho rằng ý của bạn là " git checkout master" nhưng hầu hết mọi người sẽ chỉ nói "Tôi đã chuyển sang / check out master". Dù sao, khi git nói 'Đã được cập nhật.' nó có nghĩa là nó đã không làm bất cứ điều gì. git sẽ chỉ xóa các thư mục mà nó làm cho trống.
CB Bailey

Từ ngữ xấu. Tôi đã thay đổi "HEAD" thành "master" như một số người đã đề xuất trong các nhận xét.
mculp 30/09/09

@CharlesBailey, những gì bạn nói không giống như những gì tôi thấy. git checkoutđã không loại bỏ một thư mục hoàn toàn trống.
Acumenus

@ABB: Git chỉ xóa các thư mục được làm trống bằng thao tác kiểm tra. Tôi đã thử nghiệm điều này một lần nữa; nó vẫn làm việc.
CB Bailey

2

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

Giải pháp (khi bạn đã kéo / tua đi nhanh / hợp nhất):

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

Nếu bạn không làm stashtrước đó clean, bạn sẽ mất tất cả các tệp chưa được kiểm soát của mình (không thể phục hồi).

Lưu ý: vì thao tá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 của mình để tạo lại siêu dữ liệu của 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 tệp git.


2

Tôi đã gặp vấn đề tương tự, trong trường hợp của tôi trên dịch vụ xây dựng (CI) .. khi GIT kéo tất cả các tệp mà không làm sạch thư mục, tất cả bin / obj đã được tạo trước đó bởi CI đều bị bẩn, vì vậy nếu tôi xóa dự án thử nghiệm, thùng sẽ vẫn chứa DLL và sẽ đề cập đến các bài kiểm tra không tồn tại.

Để giải quyết vấn đề này; lệnh này dường như thực hiện thủ thuật (ít nhất là đối với tôi)

git clean -fd -x

trong đó X sẽ xóa tất cả các tệp không được theo dõi:

-X Chỉ xóa các tệp bị Git bỏ qua. Điều này có thể hữu ích để xây dựng lại mọi thứ từ đầu nhưng vẫn giữ các tệp được tạo thủ công.


-1

Git hiện không theo dõi các thư mục (xem git wiki ), nghĩa là bạn không thể thêm các thư mục trống hoặc git sẽ xóa các thư mục kết thúc trống. (CHỈNH SỬA: Cảm ơn, Manni, tôi đã nhầm! Bạn không thể thêm các thư mục trống, nhưng git sẽ xóa các thư mục trở nên trống vì nội dung được theo dõi của chúng đã bị xóa. )

Đối với lệnh xóa 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ả các thư mục trố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 30/09/09

@janko, Trên thực tế, git không thể xóa một thư mục hoàn toàn trống cho tôi.
Acumenus
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.