Hoàn tác chỉ mục cập nhật git - không thay đổi <file>


463

Cách bạn Git bỏ qua việc xem / theo dõi một tập tin / thư mục cụ thể. bạn chỉ cần chạy này:

git update-index --assume-unchanged <file>

Bây giờ làm thế nào để bạn hoàn tác nó để họ được xem lại? (Hãy gọi nó là không giả định.)


5
Chỉ cần một lưu ý để nói rằng có vẻ như Skip-worktree hoàn toàn có khả năng bạn sẽ sử dụng tốt hơn là không thay đổi, trừ khi hiệu suất của git là vấn đề của bạn. stackoverflow.com/questions/13630849/
Mạnh

Câu trả lời:


587

Để có được hoàn tác / hiển thị các tập tin / thư mục được đặt thành không thay đổi, hãy chạy cái này :

git update-index --no-assume-unchanged <file>

Để có danh sách các tập tin / thư mục đang assume-unchangedchạy này :

git ls-files -v|grep '^h'


7
Cải thiện nhỏ cho câu lệnh grep của bạn, nó có thể sử dụng '^ [az]' để bắt tất cả các tệp bị bỏ qua, vì thẻ chữ cái đầu tiên có thể là các chữ cái khác với 'H' / 'h'. Từ git-scm.com/docs/git-ls-files : Tùy chọn này xác định trạng thái tệp với các thẻ sau (theo sau là khoảng trắng) ở đầu mỗi dòng: H :: cacheed S :: Skip-worktree M: : unmerged R :: đã xóa / xóa C :: đã sửa đổi / thay đổi K :: bị giết? :: khác
Bdoserror

8
Một mẹo hữu ích khác là git ls-files -v|grep '^h'|cut -c3-, nó sẽ chỉ cung cấp cho bạn tên tệp mà không có tiền tố "h".
Retsam

9
Nếu bạn không biết các tập tin nữa mà bạn assume-unchanged, chỉ cần sử dụng git update-index --really-refresh. Với lệnh đó, trước tiên bạn không cần tìm tệp git ls-files.
theDmi

103

Nếu đây là một lệnh mà bạn sử dụng thường xuyên - bạn cũng có thể muốn xem xét có bí danh cho nó. Thêm vào toàn cầu của bạn .gitconfig:

[alias]
    hide = update-index --assume-unchanged
    unhide = update-index --no-assume-unchanged

Cách đặt bí danh (nếu bạn chưa biết):

git config --configLocation alias.aliasName 'command --options'

Thí dụ:

git config --global alias.hide 'update-index --assume-unchanged'
git config... etc

Sau khi lưu cái này vào .gitconfig, bạn có thể chạy lệnh sạch hơn.

git hide myfile.ext

hoặc là

git unhide myfile.ext

Tài liệu git này rất hữu ích.

Theo các bình luận, đây cũng là một bí danh hữu ích để tìm hiểu những tập tin nào hiện đang bị ẩn:

[alias]
    hidden = ! git ls-files -v | grep '^h' | cut -c3-

2
Bí danh này cũng tiện dụng:hidden = ! git ls-files -v | grep '^h' | cut -c3-
seanf

42

Hàm git update-index có một số tùy chọn bạn có thể tìm thấy khi gõ như dưới đây:

git update-index --help

Ở đây bạn sẽ tìm thấy các tùy chọn khác nhau - cách xử lý với chỉ mục cập nhật chức năng.

[nếu bạn không biết tên tệp]

git update-index --really-refresh 

[nếu bạn biết tên tệp]

git update-index --no-assume-unchanged <file>

sẽ hoàn nguyên tất cả các tệp đã được thêm vào trong danh sách bỏ qua.

git update-index --assume-unchanged <file>

git update-index - thực sự làm mới, hoàn tác tất cả các giả định mà tôi đã thực hiện, cảm ơn vì tiền boa
Sérgio

git update-index --no-assume-unchanged <file>đã cứu mạng tôi .. ok, tôi chỉ có thể đồng bộ lại thư mục, nhưng tôi đã muốn một giải pháp "thực sự" cho vấn đề này.
Cagatay Ulubay

38

Tôi giả sử (heh) bạn có nghĩa là --assume-unchanged, vì tôi không thấy bất kỳ --assume-changedtùy chọn. Nghịch đảo --assume-unchanged--no-assume-unchanged.


32

Để tổng hợp các câu trả lời gốc tuyệt vời từ @adardesign, @adswebwork và @AnkitVishwakarma và nhận xét từ @Bdoserror, @Retsam, @seanf và @torek, với các liên kết tài liệu bổ sung và bí danh ngắn gọn ...

Các lệnh cơ bản

Để thiết lập lại một tập tin đó là giả-không thay đổi trở lại bình thường:

git update-index --no-assume-unchanged <file>

Để liệt kê tất cả các tệp được giả định không thay đổi:

git ls-files -v | grep '^[a-z]' | cut -c3-

Để đặt lại tất cả các tệp không giả định trở lại bình thường:

git ls-files -v | grep '^[a-z]' | cut -c3- | xargs git update-index --no-assume-unchanged --

Lưu ý: Lệnh này đã được liệt kê ở nơi khác dường như không đặt lại tất cả các tệp không thay đổi giả định nữa (tôi tin rằng nó đã được sử dụng và trước đây liệt kê nó như một giải pháp):

git update-index --really-refresh

Phím tắt

Để làm cho các tác vụ phổ biến này dễ thực hiện trong git, hãy thêm / cập nhật phần bí danh sau .gitconfigcho người dùng của bạn (ví dụ: ~/.gitconfigtrên hệ thống * nix hoặc macOS):

[alias]
    hide = update-index --assume-unchanged
    unhide = update-index --no-assume-unchanged
    unhide-all = ! git ls-files -v | grep '^[a-z]' | cut -c3- | xargs git update-index --no-assume-unchanged --
    hidden = ! git ls-files -v | grep '^[a-z]' | cut -c3-

1
Đối với git hidden, bạn có thể đạt được hiệu ứng tương tự mà không cần các bí danh hoặc tập lệnh shell, sử dụng !như thế này:hidden = ! git ls-files -v | grep '^h' | cut -c3-
seanf

1
--really-refreshkhông (hoặc không còn làm như vậy, có lẽ nó đã từng làm) xóa các cờ giả định không thay đổi trên các tệp chỉ mục.

Cảm ơn bạn, @torek! Tôi đã xác nhận hành vi bạn mô tả và tôi đã cập nhật câu trả lời bằng một giải pháp khác cho trường hợp "đặt lại tất cả".
Sẽ có

20

Nếu bạn muốn hoàn tác tất cả các tệp được áp dụng giả định không thay đổi với bất kỳ trạng thái nào, không chỉ được lưu trong bộ nhớ cache (git đánh dấu chúng theo ký tự trong chữ thường), bạn có thể sử dụng lệnh sau:

git ls-files -v | grep '^[a-z]' | cut -c 3- | tr '\012' '\000' | xargs -0 git update-index --no-assume-unchanged
  1. git ls-files -v sẽ in tất cả các tệp với trạng thái của chúng
  2. grep '^[a-z]' sẽ lọc các tệp và chỉ chọn giả sử không thay đổi
  3. cut -c 3- sẽ xóa trạng thái và chỉ để lại các đường dẫn, cắt từ ký tự 3 đến cuối
  4. tr '\012' '\000' sẽ thay thế ký tự cuối dòng (\ 012) thành ký tự 0 (\ 000)
  5. xargs -0 git update-index --no-assume-unchangedsẽ vượt qua tất cả các đường dẫn được phân tách bằng ký tự 0 git update-index --no-assume-unchangedđể hoàn tác

Điều này rất hữu ích. Cảm ơn về thông tin chi tiết!
Chamithra Thenuwara

11

Thêm vào @adardesigncâu trả lời của bạn, nếu bạn muốn đặt lại tất cả các tệp đã được thêm vào assume-unchangeddanh sách no-assume-unchangedtrong một lần, bạn có thể thực hiện như sau:

git ls-files -v | grep '^h' | sed 's/^..//' | sed 's/\ /\\ /g' | xargs -I FILE git update-index --no-assume-unchanged FILE || true

Điều này sẽ loại bỏ đầu ra hai ký tự từ grep tức là "h "thoát khỏi bất kỳ khoảng trắng nào có thể có trong tên tệp và cuối cùng || truesẽ ngăn lệnh kết thúc sớm trong trường hợp một số tệp trong vòng lặp có lỗi.


4

Nếu bạn đang sử dụng Tiện ích mở rộng Git , hãy làm theo các bước dưới đây:

  1. Đi đến cửa sổ cam kết.
  2. Nhấp vào danh sách thả xuống có tên Thay đổi thư mục làm việc .
  3. Chọn Hiển thị tùy chọn tập tin giả định không thay đổi .
  4. Nhấp chuột phải vào tập tin bạn muốn hủy bỏ.
  5. Chọn Không giả định không thay đổi .

Bạn xong việc rồi.


0

Không có gì ở đây không được bảo hiểm. Nhưng muốn thêm 2 xu của tôi. Đôi khi, tôi chạy một bản dựng và nó thay đổi rất nhiều tệp và sau đó tôi muốn làm việc với một cái gì đó, vì vậy lệnh này thực sự giúp tôi rất nhiều.

git update-index --assume-unchanged `git status | grep modified | sed 's|modified:||g'| xargs`

Hy vọng người khác tìm thấy nó hữu ích là tốt.


Tôi nghĩ rằng bạn sẽ được hưởng lợi từ việc sử dụng .gitignoređể bỏ qua các tạo phẩm xây dựng của bạn.
Nick

1
Tôi có .gitignorenhưng đó là đôi khi, theo kinh nghiệm của tôi là không đủ. Nhưng tôi hiểu bối cảnh mà bạn đang nói điều này.
Tyagi Akhilesh

0

Không có giải pháp nào phù hợp với tôi trong Windows - dường như sử dụng vốn Hthay vì htrạng thái tệp và lệnh grep yêu cầu thêm dấu mũ ^cũng thể hiện bắt đầu dòng cũng như phủ định ký tự tiếp theo.

Giải pháp Windows

  1. Mở Git Bash và thay đổi thư mục cấp cao nhất có liên quan.
  2. git ls-files -v | grep '^^H' liệt kê tất cả các tập tin chưa được lưu trữ
  3. git ls-files -v | grep '^^H' | cut -c 3- | tr '\012' '\000' | xargs -0 git update-index --no-skip-worktree để hoàn tác các tập tin bỏ qua tất cả các tập tin đã được thực hiện thông qua update-index --skip-worktree
  4. git ls-files -v | grep '^^H]' | cut -c 3- | tr '\012' '\000' | xargs -0 git update-index --no-assume-unchanged để hoàn tác các tập tin bỏ qua tất cả các tập tin đã được thực hiện thông qua update-index --assume-unchanged
  5. git ls-files -v | grep '^^H' một lần nữa liệt kê tất cả các tệp chưa được lưu trữ và kiểm tra xem các lệnh trên có hoạt động hay không - điều này bây giờ sẽ không trả về bất cứ điều gì

-1

Nếu bạn đang sử dụng nhật thực, bạn có thể thấy hữu ích như sau:

không giả định không thay đổi với nhật thực


1
Tại sao các downvote xin vui lòng?
Antonio
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.