git hanya menambahkan perubahan yang dimodifikasi dan mengabaikan file yang tidak terlacak

658

Saya menjalankan "git status" dan terdaftar di bawah ini adalah beberapa file yang dimodifikasi / atau di bawah judul "perubahan tidak dipentaskan untuk komit". Itu juga mencantumkan beberapa file yang tidak dilacak yang ingin saya abaikan (saya punya file ".gitignore" di direktori ini).

Saya ingin menempatkan file yang dimodifikasi dalam pementasan sehingga saya bisa mengkomitnya. Ketika saya menjalankan "git add.", Itu menambahkan file yang dimodifikasi DAN file yang ingin saya abaikan untuk pementasan.

Bagaimana cara menambahkan hanya file yang dimodifikasi dan mengabaikan file yang tidak terlacak jika disajikan dengan status git di bawah ini.

Juga, apakah file ".gitignore" saya berfungsi dengan baik?

$ 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")
Steve
sumber
1
jika Anda telah menambahkan file .gitignore SETELAH Anda telah melacak file, maka file .gitignore tidak akan mengabaikan file yang sudah dilacak. itu bisa menjadi masalah.
BKSpurgeon

Jawaban:

904

Idealnya Anda .gitignoreharus mencegah file yang tidak terlacak (dan diabaikan) agar tidak ditampilkan dalam status, ditambahkan menggunakan git adddll. Jadi saya akan meminta Anda untuk memperbaiki Anda.gitignore

Anda dapat melakukannya git add -usehingga akan mem-stage file yang dimodifikasi dan dihapus.

Anda juga dapat melakukan git commit -auntuk hanya melakukan file yang dimodifikasi dan dihapus.

Perhatikan bahwa jika Anda memiliki Git versi sebelum 2.0 dan digunakan git add ., maka Anda harus menggunakan git add -u .(Lihat " Perbedaan" git add -A"dan" git add ." ").

manojlds
sumber
74
tempat menarik, ini ( add -u) tidak hanya menambahkan modifiedfile, itu juga "menambahkan" deletedyang .. sesuatu yang saat ini saya coba cegah.
Zach Lysobey
6
Untuk hanya menambahkan file yang dimodifikasi, saya biasanya pergi ke atas direktori repo dan ketik saya for fil in $(git diff --name-only --relative); do git add $fil; done. Jika saya sering menggunakannya (saya tidak), saya hanya akan membuat alias untuk ini di ~/.bashrcfile saya . Ini, tentu saja, hanya bekerja di bash.
Krøllebølle
8
Tidak ada jawaban yang pasti, hanya jawaban "berfungsi untuk kebanyakan orang"? Saya harus menggunakan proses lain untuk melakukan ini dengan benar? Bagaimana ini tidak dibangun ke git add? Sepertinya hal yang umum ingin dilakukan.
Samuel
2
nb metode yang disebutkan dalam komentar ini akan gagal jika Anda memiliki nama file aneh (spasi, tanda bintang, apa yang tidak). Untuk menghindari file yang aneh, gunakan:IFS=$(echo -en "\n\b"); for file in $(git diff --name-only); do git add "$file"; done
Orwellophile
3
git add -uadalah kependekan dari git add --updatedan git commit -amerupakan kependekan darigit commit --all
Hugo
96

Ini bekerja untuk saya:

#!/bin/bash

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

Atau lebih baik lagi:

$ git ls-files --modified | xargs git add
pengguna877329
sumber
Anda tidak perlu pengelompokan (()) jika Anda tidak akan menggunakan kembali grup, dan meninggalkan spasi putih di depan nama file untuk saya. Bukan berarti itu akan mempengaruhi hasil akhir dalam kasus ini, tetapi demi memberikan contoh, inilah perintah sed yang saya gunakan: sed 's /.* dimodifikasi: * //'. Diverifikasi pada Mac OS X 10.9.5.
Samuel
Pengelompokan @Samuel bagus saat menguji ekspresi. Lalu saya bisa mencetak korek di dalam kurung kotak untuk memastikan bahwa saya benar.
user877329
1
@ Ярослав solusi Anda menambahkan file yang dimodifikasi dan tidak terlacak dan sama dengan git add -u, sehingga tidak menjawab pertanyaan.
Nick Volynkin
7
--modified tampaknya termasuk yang dihapus dan baru saja dimodifikasi
DMart
2
git diff-files -z --diff-filter = M --name-only | xargs -0 git add --dry-run tampaknya bekerja dengan baik.
DMart
10
git commit -a -m "message"

-a: Termasuk semua file yang saat ini diubah / dihapus dalam komit ini. Perlu diingat, bagaimanapun, bahwa file yang tidak terlacak (baru) tidak termasuk.

-m: Mengatur pesan komit

Saurabh
sumber
4

Anda tidak mengatakan apa yang Anda miliki saat ini .gitignore, tetapi a .gitignoredengan konten berikut di direktori root Anda harus melakukan trik.

.metadata
build
Karl Bielefeldt
sumber
3
Saya menggunakan .gitignore saya semua salah. Saya memiliki file .gitignore kosong di setiap direktori yang ingin saya abaikan daripada memiliki satu gitignore dengan konten di dalamnya.
Steve
1
@Steve: Ini akan berhasil jika masing-masing. gitognoreberisi awal (abaikan semuanya). Tetapi satu .gitignoredi direktori teratas biasanya lebih sederhana untuk digunakan dan mencukupi.
maaartinus
2

Saya kebetulan mencoba ini sehingga saya bisa melihat daftar file terlebih dahulu:

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

cat ./file.sh

menjalankan:

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

Sunting: (lihat komentar) Ini dapat dicapai dalam satu langkah:

git status | grep "modified:" | awk '{print $2}' | xargs git add && git status
Mike Q
sumber
1
Ini bisa dicapai dalam satu langkah:git status | grep modified | awk '{print $2}' | xargs git add && git status
Choylton B. Higginbottom
Ya saya harus menyediakan solusi itu juga, terima kasih, saya memperbarui posting.
Mike Q
1

Tidak yakin apakah ini fitur atau bug tetapi ini berhasil bagi kami:

git commit '' -m "Message"

Perhatikan daftar file kosong ''. Git menafsirkan ini untuk mengkomit semua file terlacak yang dimodifikasi, bahkan jika mereka tidak dipentaskan, dan mengabaikan file yang tidak terlacak.

Erik Englund
sumber
Ini pasti tidak berfungsi saat menggunakan --amend.
GhostCat
1

Untuk menampilkan file yang dimodifikasi dan dihapus

git add -u

Dayamoy
sumber