git chỉ thêm các thay đổi đã sửa đổi và bỏ qua các tệp không bị theo dõi


658

Tôi đã chạy "trạng thái git" và được liệt kê bên dưới là một số tệp đã được sửa đổi / hoặc dưới tiêu đề "những thay đổi không được tổ chức cho cam kết". Nó cũng liệt kê một số tệp chưa được theo dõi mà tôi muốn bỏ qua (tôi có tệp ".gitignore" trong các thư mục này).

Tôi muốn đặt các tệp sửa đổi trong dàn để tôi có thể cam kết chúng. Khi tôi chạy "git add.", Nó đã thêm các tệp đã sửa đổi VÀ các tệp tôi muốn bỏ qua để dàn dựng.

Làm cách nào để tôi chỉ thêm các tệp đã sửa đổi và bỏ qua các tệp không bị theo dõi nếu được hiển thị với trạng thái git bên dưới.

Ngoài ra, các tệp ".gitignore" của tôi có hoạt động tốt không?

$ git status
# On branch addLocation
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       modified:   someProject/path/domain/viewer/LocationDO.java
#       modified:   someProject/path/service/ld/LdService.java
#       modified:   someProject/path/service/ld/LdServiceImpl.java
#       modified:   someProject/path/web/jsf/viewer/LocationFormAction.java
#       modified:   someProject/war/WEB-INF/classes/message/viewer/viewer.properties
#       modified:   someProject/war/page/viewer/searchForm.xhtml
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       .metadata/
#       someProject/build/
no changes added to commit (use "git add" and/or "git commit -a")

1
nếu bạn đã thêm tệp .gitignore SAU KHI bạn đã theo dõi các tệp thì tệp .gitignore sẽ không bỏ qua các tệp đã được theo dõi. đó có thể là một vấn đề
BKSpurgeon

Câu trả lời:


903

Tốt nhất là bạn .gitignorenên ngăn các tệp không bị theo dõi (và bị bỏ qua) hiển thị ở trạng thái, được thêm vào bằng cách sử dụng git add, vì vậy tôi sẽ yêu cầu bạn sửa lỗi của bạn.gitignore

Bạn có thể làm git add -unhư vậy để nó sẽ xử lý các tệp bị sửa đổi và bị xóa.

Bạn cũng có thể làm git commit -ađể chỉ cam kết các tệp đã sửa đổi và bị xóa.

Lưu ý rằng nếu bạn có Git của phiên bản trước 2.0 và sử dụng git add ., sau đó bạn sẽ cần phải sử dụng git add -u .(Xem " Sự khác biệt của‘ git add -A’và‘ git add . ").


74
điểm quan tâm, điều này ( add -u) không chỉ thêm modifiedcác tệp, nó cũng "thêm" deletednhững thứ .. một cái gì đó tôi hiện đang cố gắng ngăn chặn.
Zach Lysobey

6
Để chỉ thêm các tệp đã sửa đổi, tôi thường vào đầu thư mục trên cùng của repo và gõ for fil in $(git diff --name-only --relative); do git add $fil; done. Nếu tôi đã sử dụng nó rất nhiều (tôi không), tôi sẽ chỉ tạo một bí danh cho điều này trong ~/.bashrctập tin của mình . Điều này, tất nhiên, chỉ hoạt động trong bash.
Krøllebølle

8
Không có câu trả lời chắc chắn, chỉ có câu trả lời "làm việc cho hầu hết mọi người"? Tôi phải sử dụng một quá trình khác để làm điều này một cách chính xác? Làm thế nào là điều này không được xây dựng vào git add? Có vẻ như một điều phổ biến như vậy muốn làm.
Samuel

2
nb các phương thức được đề cập trong các nhận xét này sẽ thất bại nếu bạn có tên tệp lẻ (dấu cách, dấu hoa thị, những gì không). Để thoát đúng mọi tệp có tên lạ, sử dụng:IFS=$(echo -en "\n\b"); for file in $(git diff --name-only); do git add "$file"; done
Orwellophile

3
git add -ulà viết tắt của git add --updategit commit -aviết tắt củagit commit --all
Hugo

95

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

#!/bin/bash

git add `git status | grep modified | sed 's/\(.*modified:\s*\)//'`

Hoặc thậm chí tốt hơn:

$ git ls-files --modified | xargs git add

Bạn không cần nhóm (()) nếu bạn sẽ không sử dụng lại nhóm và khoảng trắng còn lại phía trước tên tệp cho tôi. Không phải là nó sẽ ảnh hưởng đến kết quả cuối cùng trong trường hợp này, nhưng vì mục đích thiết lập một ví dụ ở đây, lệnh sed tôi đã sử dụng: sed 's /.* đã sửa đổi: * //'. Đã xác minh trên Mac OS X 10.9.5.
Samuel

@Samuel Grouping rất hay khi kiểm tra biểu thức. Sau đó, tôi có thể in trận đấu bên trong dấu ngoặc vuông để thấy rằng tôi đúng.
dùng877329

1
@ Рос mặc dù giải pháp của bạn thêm các tệp được sửa đổi và không bị theo dõi và bằng git add -u, vì vậy nó không trả lời câu hỏi.
Nick Volynkin

7
--modified dường như bao gồm xóa cũng như vừa sửa đổi
DMart

2
git diff-files -z --diff-filter = M --name-only | xargs -0 git add --dry-run dường như hoạt động tốt.
DMart

10
git commit -a -m "message"

-a: Bao gồm tất cả các tệp hiện đang thay đổi / bị xóa trong cam kết này. Tuy nhiên, hãy nhớ rằng các tệp không được theo dõi (mới) không được bao gồm.

-m: Đặt thông điệp của cam kết


4

Bạn đã không nói những gì hiện tại của bạn .gitignore, nhưng .gitignorevới các nội dung sau trong thư mục gốc của bạn sẽ thực hiện thủ thuật.

.metadata
build

3
Tôi đã sử dụng .gitignore của tôi sai tất cả. Tôi đã có một tệp .gitignore trống trong mọi thư mục mà tôi muốn bỏ qua thay vì có một gitignore duy nhất có nội dung trong đó.
Steve

1
@Steve: Điều này sẽ làm việc nếu mỗi. gitognorechứa một sự khởi đầu (bỏ qua mọi thứ). Nhưng một .gitignoretrong thư mục hàng đầu thường đơn giản hơn nhiều để sử dụng và đủ.
maaartinus

2

Tôi tình cờ thử điều này để tôi có thể xem danh sách các tập tin đầu tiên:

git status | grep "modified:" | awk '{print "git add  " $2}' > file.sh

cat ./file.sh

hành hình:

chmod a+x file.sh
./file.sh 

Chỉnh sửa: (xem bình luận) Điều này có thể đạt được trong một bước:

git status | grep "modified:" | awk '{print $2}' | xargs git add && git status

1
Điều này có thể đạt được trong một bước:git status | grep modified | awk '{print $2}' | xargs git add && git status
Choylton B. Higginbottom

Vâng tôi nên đã cung cấp giải pháp đó là tốt, cảm ơn, tôi đã cập nhật bài viết.
Mike Q

1

Không chắc đây là một tính năng hay một lỗi nhưng điều này đã làm việc cho chúng tôi:

git commit '' -m "Message"

Lưu ý danh sách tập tin trống ''. Git diễn giải điều này để cam kết tất cả các tệp được theo dõi đã sửa đổi, ngay cả khi chúng không được dàn dựng và bỏ qua các tệp không được theo dõi.


Điều này chắc chắn không hoạt động khi sử dụng --amend.
GhostCat

0

Để giai đoạn sửa đổi và xóa các tập tin

git add -u

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.