Làm thế nào để loại bỏ một thư mục từ kho git?


1235

Tôi có 2 thư mục trên kho GitHub của mình. Tôi muốn xóa một trong số họ. Làm thế nào tôi có thể làm điều đó mà không xóa và tạo lại toàn bộ kho lưu trữ?


1
Có tập tin nào trong thư mục không?
Fred Foo

3
@Iarsmans: Có 6 tập tin. Cả hai thư mục giống hệt nhau ngoại trừ một là chữ hoa, một thư mục khác là chữ thường.
Sahat Yalkabov

Câu trả lời:


2326

Xóa thư mục khỏi git và local

Bạn có thể kiểm tra 'master' với cả hai thư mục;

git rm -r one-of-the-directories // This deletes from filesystem
git commit . -m "Remove duplicated directory"
git push origin <your-git-branch> (typically 'master', but not always)

Xóa thư mục khỏi git nhưng KHÔNG cục bộ

Như đã đề cập trong các bình luận, những gì bạn thường muốn làm là xóa thư mục này khỏi git nhưng không xóa nó hoàn toàn khỏi hệ thống tập tin (cục bộ)

Trong trường hợp đó sử dụng:

git rm -r --cached myFolder

8
Tôi đã có tình huống chính xác như vậy. Khi tôi thử git rm -r myFoldernó hoạt động, nhưng cũng xóa mọi thứ khỏi thư mục "MyFolder". Phải hoàn nguyên mọi thứ trong thư mục "MyFolder" và sau đó cam kết.
Justin

240
@Justin Để chỉ xóa khỏi git và để nguyên hệ thống tệp, hãy sử dụnggit rm -r --cached myFolder
karmakaze

32
Thông báo lỗi tôi nhận được là: fatal: pathspec 'thư mục' không khớp với bất kỳ tệp nào.
user2441441

3
@ user2441441 Tôi gặp lỗi này khi bật lên khi tôi đang cố xóa một thư mục / tệp không được thêm vào repo
lukeatdesignworks

3
git rm -r --cached directory/chỉ xóa khỏi git theo dõi, nhưng cấu trúc kho lưu trữ vẫn còn.
Néstor

287

Để xóa thư mục / thư mục chỉ từ kho git chứ không phải từ cục bộ, hãy thử 3 lệnh đơn giản.


Các bước để loại bỏ thư mục

git rm -r --cached FolderName
git commit -m "Removed folder from repository"
git push origin master

Các bước để bỏ qua thư mục đó trong các lần xác nhận tiếp theo

Để bỏ qua thư mục đó từ các lần xác nhận tiếp theo, hãy tạo một tệp trong thư mục gốc có tên .gitignore và đặt tên thư mục đó vào đó. Bạn có thể đặt bao nhiêu tùy thích

tập tin .gitignore sẽ trông như thế này

/FolderName

xóa thư mục


1
Bạn cũng sẽ cần phải thực hiện git rm -r --cached FolderName git commit -m "Đã xóa thư mục khỏi kho lưu trữ" trên máy tính khác của bạn và sau đó thực hiện thao tác kéo để giữ cho nó đồng bộ.
Simon

1
Điều này sẽ xóa thư mục từ thời điểm nó được thêm vào kho lưu trữ? Hoặc nó chỉ là để loại bỏ thư mục và giới thiệu nó đến .git repo?
alpha_989

1
Tuyệt quá! Đang làm việc!
BeingCoders

2
Giải thích rõ, câu trả lời hay
Rakshit Shah

1
làm tốt. Trên máy của tôi, bước thứ ba không hoạt động. Nhưng nó hoạt động nếu nó được đổi thành $ git đẩy
Hong

82

Nếu, vì một số lý do, những gì karmakaze nói không hoạt động, bạn có thể thử xóa thư mục bạn muốn sử dụng hoặc với trình duyệt hệ thống tệp của bạn (ví dụ: trong Windows File Explorer). Sau khi xóa thư mục, ban hành lệnh:
git add -A
và sau
git commit -m 'deleting directory'
đó
git push origin master.


4
Điều này làm việc cho tôi. Bạn có thể giải thích đối số -A?
Arun

2
@Arun -A là viết tắt của --all và thêm các thay đổi từ tất cả các tệp được theo dõi và không bị theo dõi
Joachim Rohde

Điều này làm việc cho tôi.
UVM

20

Bạn có thể thử điều này: git rm -rf <directory_name>

Nó sẽ buộc xóa thư mục.


3
điều này cũng sẽ xóa khỏi thư mục địa phương
abdul Rehman kk

18

Nếu bạn loại bỏ các tệp trong thư mục ( git rmnhư các câu trả lời khác giải thích), thì thư mục đó không còn tồn tại khi có liên quan đến git. Bạn không thể cam kết một thư mục trống, bạn cũng không thể xóa một thư mục.

Điều này không giống như lật đổ mà bạn phải nói rõ ràng svn rm emptyfolder/và tình cờ tại sao mantrang git mô tả chính nó là "trình theo dõi nội dung ngu ngốc"

Câu trả lời về "Làm cách nào để thêm thư mục trống vào kho git" liên kết đến Câu hỏi thường gặp về chủ đề này :

Hiện tại, việc thiết kế chỉ số git (khu vực tổ chức) chỉ cho phép các tệp được liệt kê và không ai đủ thẩm quyền để thực hiện thay đổi để cho phép các thư mục trống đã quan tâm đủ về tình huống này để khắc phục.

Thư mục được thêm tự động khi thêm tệp bên trong chúng. Đó là, các thư mục không bao giờ phải được thêm vào kho lưu trữ và không được theo dõi riêng.

Bạn có thể nói " git add <dir>" và nó sẽ thêm các tập tin vào đó.

Nếu bạn thực sự cần một thư mục tồn tại trong thanh toán, bạn nên tạo một tệp trong đó. .gitignore hoạt động tốt cho mục đích này; bạn có thể để trống hoặc điền vào tên của các tệp bạn muốn hiển thị trong thư mục.


8

Tôi đã cam kết thư mục trước đó và muốn xóa thư mục trong lịch sử.

Tôi đã làm như sau:

Thêm thư mục vào .gitignore:

echo Folder_Name/ >> .gitignore

Xóa khỏi tất cả các cam kết:

git filter-branch --index-filter 'git rm -rf --cached --ignore-unmatch Folder_Name/' --prune-empty --tag-name-filter cat -- --all

xóa các giới thiệu khỏi các cam kết cũ:

git for-each-ref --format="%(refname)" refs/original/ | xargs -n 1 git update-ref -d

Đảm bảo tất cả các ref cũ được loại bỏ hoàn toàn

rm -Rf .git/logs .git/refs/original

Thực hiện thu gom rác

git gc --prune=all --aggressive

đẩy bạn thay đổi vào kho lưu trữ trực tuyến:

git push

Bạn đã làm xong ở đây.

Nhưng bạn có thể làm như sau để đẩy tất cả các thay đổi tới tất cả các nhánh bằng: Nhưng hãy cẩn thận với lệnh này!

git push origin --all --force
git push origin --tags --force

Sau đó, thư mục đã bị xóa khỏi git, nhưng không bị xóa khỏi đĩa cục bộ.


7

để xóa các thư mục trống

Tôi muốn xóa một thư mục trống (thư mục) tôi đã tạo, git không thể xóa nó, sau một số nghiên cứu tôi đã học được Git không theo dõi các thư mục trống. Nếu bạn có một thư mục trống trong cây làm việc của mình, bạn chỉ cần xóa nó bằng

rm -r folderName

Không cần liên quan đến Git.


1
Cảm ơn! Đó chỉ là những gì tôi cần.
SpyrosKo

6

Chuyển đến Thư mục git của bạn sau đó nhập lệnh sau: rm -rf < Tên thư mục >

Sau khi xóa thư mục, hãy xác nhận các thay đổi bằng cách: git commit -m "Thông điệp cam kết của bạn"

Sau đó, chỉ cần đẩy các thay đổi trên thư mục GIT từ xa: git push origin < Tên chi nhánh >


4

Bạn có thể xóa thư mục cục bộ và sau đó đẩy, như sau:

git rm -r folder_name
git commit -m "your commit"
git push origin master

4

Tôi thường sử dụng git add --allđể loại bỏ các tập tin / thư mục từ kho lưu trữ từ xa

rm -r folder_name
git add --all
git commit -m "some comment"
git push origin master

master có thể được thay thế bởi bất kỳ chi nhánh khác của kho lưu trữ.


2

Bạn có thể sử dụng Cây nguồn Attlasian (Windows) ( https://www.atlassian.com/software/sourcetree/overview ). Chỉ cần chọn các tập tin từ cây và nhấn nút "Xóa" ở trên cùng. Các tệp sẽ bị xóa khỏi kho lưu trữ cục bộ và cơ sở dữ liệu git cục bộ. Rồi Cam kết, rồi đẩy.


Đây là những gì tôi làm là tốt. Đã làm cho nó thực sự dễ dàng để làm, mặc dù, học lệnh git là một điều tốt để biết.
Micah Montoya

1

Một trong những đồng nghiệp của tôi đã đề xuất BFG Repo-Cleaner mà tôi nghĩ là mạnh mẽ. Nó không chỉ xóa dữ liệu không mong muốn mà còn xóa sạch kho lưu trữ của bạn khỏi mọi thông tin cam kết liên quan.


1

Để thêm thư mục mới:

mkdir <YOUR-DIRECTORY>

Nhưng bây giờ Git không biết thư mục mới này, vì Git theo dõi tệp không phải thư mục TRỰC TIẾP

git status

Git sẽ không nhận thức được với thay đổi chúng tôi đã thực hiện, vì vậy chúng tôi thêm .keeptệp ẩn để Git nhận biết bằng thay đổi mới này.

touch /YOUR-directory/.keep

Bây giờ, nếu bạn nhấn git statusGit sẽ nhận thức được với các thay đổi.

Và nếu bạn muốn xóa thư mục, bạn nên sử dụng lệnh này.

rm -r <YOUR-DIRECTORY>

Và nếu bạn kiểm tra bằng cách sử dụng git status, bạn sẽ thấy thư mục đã bị xóa.


0

Lệnh git đầu tiên cần biết bạn là ai trước khi xóa bất cứ điều gì

  1. git init
  2. git config user.name "someone"
  3. git config user.email "someone@someplace.com"
  4. git rm -r
  5. git commit -m "xóa dir"
  6. git đẩy nguồn gốc

0

Một sự kết hợp của 2 câu trả lời làm việc cho tôi

git rm -r one-of-the-directories
git commit . -m "Remove duplicated directory"
git push

nếu nó vẫn hiển thị một số cảnh báo, hãy xóa các tệp theo cách thủ công

git filter-branch --tree-filter 'rm -rf path/to/your/file' HEAD
git push
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.