git sadece değiştirilen değişiklikleri ekle ve izlenmeyen dosyaları yoksay


658

"Git status" komutunu çalıştırdım ve aşağıda listelenen bazı dosyalar şunlardır: "taahhüt için sahnelenmeyen değişiklikler" başlığı altında. Ayrıca yoksaymak istediğiniz bazı izlenmemiş dosyaları listeledi (Bu dizinlerde bir ".gitignore" dosyası var).

Değiştirilmiş dosyaları hazırlamaya koymak istiyorum, böylece bunları yerine getirebiliyorum. "Git add." Komutunu çalıştırdığımda değiştirilmiş dosyaları VE yoksaymak istediğim dosyaları hazırlamaya ekledi.

Aşağıdaki git durumu ile sunulursa, yalnızca değiştirilmiş dosyaları nasıl ekler ve izlenmeyen dosyaları nasıl yok sayarım.

Ayrıca, ".gitignore" dosyalarım düzgün çalışıyor mu?

$ 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
.gitignore dosyasını dosyaları izledikten SONRA eklediyseniz, .gitignore dosyası zaten izlenen dosyaları yok saymaz. bu bir sorun olabilir.
BKSpurgeon

Yanıtlar:


904

İdeal olarak .gitignore, izlenmeyen (ve yoksayılan) dosyaların durum gösterilmesini, git addvb. Kullanılarak eklenmesini önlemelisiniz . Bu yüzden sizden.gitignore

git add -uDeğiştirilmiş ve silinmiş dosyaları sahne alacak şekilde yapabilirsiniz .

git commit -aYalnızca değiştirilen ve silinen dosyaları yürütmek için de yapabilirsiniz .

Git 2.0 sürümüne sahipseniz ve kullandıysanız git add ., o zaman kullanmanız gerekir git add -u .(Bkz . " git add -A" Ve " git add ." " Farkı ).


74
ilgi çekici, this ( add -u) sadece modified dosyaları eklemek değil , aynı zamanda "ekler" deleted.. şu anda önlemeye çalışıyorum bir şey.
Zach Lysobey

6
Yalnızca değiştirilmiş dosyaları eklemek için genellikle yazım ve yazımın üst dizinine giderim for fil in $(git diff --name-only --relative); do git add $fil; done. Eğer çok kullanacak olsaydım (kullanmam), sadece dosyamda bunun için bir takma ad yapardım ~/.bashrc. Bu elbette sadece bash'da işe yarıyor.
Krøllebølle

8
Kesin cevap yok, sadece "çoğu insan için çalışıyor" cevapları mı? Bunu doğru yapmak için başka bir işlem kullanmak zorunda mıyım? Bu git add içine nasıl yerleştirilmez? Yapmak istemek gibi yaygın bir şey gibi görünüyor.
Samuel

2
nb tuhaf dosya (boşluk, ne değildir yıldız,) varsa bu yorum olarak bahsedilen yöntemler başarısız olur. Garip bir şekilde adlandırılmış dosyalardan düzgün bir şekilde kaçmak için şunu kullanın:IFS=$(echo -en "\n\b"); for file in $(git diff --name-only); do git add "$file"; done
Orwellophile

3
git add -uiçin kısa git add --updateve git commit -akısagit commit --all
Hugo

96

Bu benim için çalıştı:

#!/bin/bash

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

Ya da daha iyisi:

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

Grubu yeniden kullanmayacaksanız, gruplandırmaya (()) ihtiyacınız yoktur ve benim için dosya adının önünde boşluk bırakmıştır. Bu durumda nihai sonucu etkileyeceği için değil, bir örnek ayarlamak için işte kullandığım sed komutu: sed 's /.* modifiye: * //'. Mac OS X 10.9.5'te doğrulandı.
Samuel

@Samuel Gruplama ifadeyi test ederken güzeldir. Sonra haklı olduğumu görmek için maçı köşeli parantez içine yazdırabilirim.
user877329

1
@ Ярослав çözümünüz değiştirilmiş ve izlenmemiş dosyalar ekler ve eşittir git add -u, bu yüzden soruya cevap vermez.
Nick Volynkin

7
--modified silinmiş ve sadece değiştirilmiş gibi görünüyor
DMart

2
git diff-files -z --diff-filter = M - yalnızca ad | xargs -0 git add --dry-run iyi çalışıyor gibi görünüyor.
DMart

10
git commit -a -m "message"

-a: Şu anda değiştirilmiş / silinmiş tüm dosyaları bu işleme dahil eder. Ancak, izlenmeyen (yeni) dosyaların dahil edilmediğini unutmayın.

-m: İşlemin mesajını ayarlar


4

Şu anda ne olduğunu söylemediniz .gitignore, ancak .gitignorekök dizininizde aşağıdaki içeriğe sahip bir a hile yapmalıdır.

.metadata
build

3
.Gitignore'umu tamamen yanlış kullanıyordum. İçinde içeriği olan tek bir gitignore yerine, yoksaymak istediğim her dizinde boş bir .gitignore dosya vardı.
Steve

1
@Steve: Bu her biri işe yarar. gitognorebir başlangıç ​​içeriyordu (her şeyi yoksay). Ancak .gitignore, üst dizindeki tek bir dosyanın kullanımı genellikle daha basittir ve yeterlidir.
maaartinus

2

Önce dosya listesini görebilmek için bunu denemek oldu:

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

cat ./file.sh

yürütün:

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

Düzenleme: (yorumlara bakın) Bu bir adımda gerçekleştirilebilir:

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

1
Bu bir adımda gerçekleştirilebilir:git status | grep modified | awk '{print $2}' | xargs git add && git status
Choylton B. Higginbottom

Evet, bu çözümü de sağlamalıydım, teşekkürler, yazıyı güncelledim.
Mike Q

1

Bunun bir özellik veya hata olup olmadığından emin değilim ama bu bizim için çalıştı:

git commit '' -m "Message"

Boş dosya listesine dikkat edin ''. Git bunu, değiştirilmemesine rağmen değiştirilmiş tüm izlenen dosyaları yürütmek ve izlenmeyen dosyaları yok saymak için yorumlar.


Bu kesinlikle yok değil --amend kullanırken çalışır.
GhostCat

1

Değiştirilmiş ve silinmiş dosyaları yerleştirmek için

git add -u

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.