git เพิ่มการเปลี่ยนแปลงที่แก้ไขแล้วเท่านั้นและไม่สนใจไฟล์ที่ไม่ได้ติดตาม


658

ฉันรัน "สถานะคอมไพล์" และรายการด้านล่างเป็นไฟล์บางไฟล์ที่มีการแก้ไข / หรือภายใต้หัวข้อ "การเปลี่ยนแปลงที่ไม่ได้จัดเตรียมไว้สำหรับคอมมิท" นอกจากนี้ยังแสดงรายการไฟล์ที่ไม่ได้ติดตามที่ฉันต้องการละเว้น (ฉันมีไฟล์ ".gitignore" ในไดเรกทอรีเหล่านี้)

ฉันต้องการวางไฟล์ที่แก้ไขแล้วในการจัดเตรียมเพื่อให้สามารถคอมมิทได้ เมื่อฉันรัน "git add." มันจะเพิ่มไฟล์ที่แก้ไขแล้วและไฟล์ที่ฉันต้องการข้ามไปยังการจัดเตรียม

ฉันจะเพิ่มเฉพาะไฟล์ที่ถูกแก้ไขได้อย่างไรและไม่สนใจไฟล์ที่ไม่ได้ติดตามหากแสดงด้วยสถานะ git ด้านล่าง

ไฟล์ ".gitignore" ของฉันทำงานอย่างถูกต้องหรือไม่

$ 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 หลังจากที่คุณติดตามไฟล์แล้วไฟล์. gitignore จะไม่เพิกเฉยต่อไฟล์ที่ถูกติดตามอยู่แล้ว นั่นอาจเป็นปัญหา
BKSpurgeon

คำตอบ:


904

เป็นการดีที่คุณ.gitignoreควรป้องกันไฟล์ที่ไม่ได้ติดตาม (และละเว้น) ไม่ให้แสดงในสถานะเพิ่มโดยใช้git addฯลฯ ดังนั้นฉันจะขอให้คุณแก้ไขของคุณ.gitignore

คุณสามารถทำเช่นgit add -uนั้นเพื่อให้ไฟล์ที่ถูกดัดแปลงและลบถูกจัดวาง

นอกจากนี้คุณยังสามารถgit commit -aกระทำเพื่อส่งไฟล์ที่ถูกแก้ไขและลบเท่านั้น

โปรดทราบว่าหากคุณมี Git เวอร์ชันก่อน 2.0 และใช้งานgit add .คุณจะต้องใช้git add -u .(ดู " ความแตกต่างของ" git add -A"และ" git add ." ")


74
จุดที่น่าสนใจ ( add -u) นี้ไม่ได้เพิ่มเฉพาะ modifiedไฟล์เท่านั้นมันยัง "เพิ่ม" deletedสิ่งที่ฉันกำลังพยายามป้องกันอยู่
Zach Lysobey

6
for fil in $(git diff --name-only --relative); do git add $fil; doneหากต้องการเพิ่มเพียงการแก้ไขไฟล์ผมมักจะไปข้างบนไดเรกทอรีด้านบนของธุรกรรมซื้อคืนและประเภทของฉัน ถ้าฉันจะใช้มันเยอะ (ฉันทำไม่ได้) ฉันจะสร้างนามแฝงสำหรับ~/.bashrcไฟล์นี้ ซึ่งแน่นอนว่าใช้งานได้กับทุบตีเท่านั้น
Krøllebølle

8
ไม่มีคำตอบที่ชัดเจนมีเพียงคำตอบ "เหมาะสำหรับคนส่วนใหญ่" เท่านั้น ฉันต้องใช้กระบวนการอื่นเพื่อทำอย่างถูกต้องหรือไม่ สิ่งนี้ไม่ได้ถูกสร้างขึ้นเพื่อเพิ่มคอมไพล์? ดูเหมือนว่าเป็นเรื่องธรรมดาที่อยากจะทำ
ซามูเอล

2
nbวิธีการที่กล่าวถึงในความคิดเห็นเหล่านี้จะล้มเหลวหากคุณมีชื่อไฟล์แปลก (ช่องว่าง, เครื่องหมายดอกจัน, อะไรไม่) ในการหลีกเลี่ยงไฟล์ที่มีชื่อแปลก ๆ ให้ใช้:IFS=$(echo -en "\n\b"); for file in $(git diff --name-only); do git add "$file"; done
Orwellophile

3
git add -uสั้นgit add --updateและgit commit -aสั้นสำหรับgit commit --all
Hugo

96

สิ่งนี้ใช้ได้กับฉัน:

#!/bin/bash

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

หรือดีกว่า:

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

คุณไม่จำเป็นต้องจัดกลุ่ม (()) หากคุณจะไม่นำกลุ่มนั้นกลับมาใช้ใหม่และ \ s เหลือช่องว่างด้านหน้าชื่อไฟล์ให้ฉัน ไม่ใช่ว่าจะมีผลต่อผลลัพธ์สุดท้ายในกรณีนี้ แต่เพื่อตั้งค่าตัวอย่างนี่คือคำสั่ง sed ที่ฉันใช้: sed 's /.* modified: * //' ตรวจสอบแล้วบน Mac OS X 10.9.5
ซามูเอล

@ การจัดกลุ่มซามูเอลนั้นดีเมื่อทำการทดสอบนิพจน์ จากนั้นฉันสามารถพิมพ์การแข่งขันภายในวงเล็บเหลี่ยมเพื่อดูว่าฉันถูกต้อง
user877329

1
@ Ярославโซลูชันของคุณเพิ่มไฟล์ที่แก้ไขและไม่ได้ติดตามและมีค่าเท่ากับgit add -uดังนั้นจึงไม่ตอบคำถาม
Nick Volynkin

7
- แก้ไขดูเหมือนว่าจะมีการลบรวมทั้งแก้ไขเพียง
DMart

2
git diff-files -z --diff-filter = M - ชื่อเท่านั้น | xargs -0 git add --dry-run ดูเหมือนว่าจะทำงานได้ดี
DMart

10
git commit -a -m "message"

-a: รวมไฟล์ที่ถูกเปลี่ยน / ลบทั้งหมดในการคอมมิทนี้ อย่างไรก็ตามโปรดทราบว่าจะไม่มีไฟล์ที่ไม่ได้ติดตาม (ใหม่)

-m: ตั้งค่าข้อความคอมมิท


4

คุณไม่ได้พูดในสิ่งที่เป็นอยู่ในปัจจุบันของคุณ.gitignoreแต่ a .gitignoreด้วยเนื้อหาต่อไปนี้ในไดเรกทอรีรากของคุณควรทำเคล็ดลับ

.metadata
build

3
ฉันใช้. gignignore ของฉันผิดทั้งหมด ฉันมีไฟล์. gitignore ที่ว่างเปล่าในทุก ๆ ไดเรกทอรีที่ฉันต้องการเพิกเฉยแทนที่จะมี gitignore เดียวที่มีเนื้อหาอยู่ในนั้น
สตีฟ

1
@Steve: สิ่งนี้จะใช้ได้ถ้าแต่ละคน gitognoreมีจุดเริ่มต้น (ละเว้นทุกสิ่ง) แต่.gitignoreในไดเรกทอรีบนสุดมักจะใช้ง่ายและเพียงพอ
maaartinus

2

ฉันลองทำสิ่งนี้แล้วฉันจะได้เห็นรายการไฟล์ก่อน:

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

cat ./file.sh

ดำเนินการ:

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

แก้ไข: (ดูความคิดเห็น) สามารถทำได้ในขั้นตอนเดียว:

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

1
สามารถทำได้ในขั้นตอนเดียว:git status | grep modified | awk '{print $2}' | xargs git add && git status
Choylton B. Higginbottom

ใช่ฉันควรให้วิธีแก้ปัญหานั้นด้วยขอบคุณฉันอัพเดทโพสต์
Mike Q

1

ไม่แน่ใจว่านี่เป็นคุณสมบัติหรือข้อผิดพลาด แต่สิ่งนี้ใช้ได้สำหรับเรา:

git commit '' -m "Message"

บันทึกรายการไฟล์ว่าง '' Git ตีความสิ่งนี้เพื่อส่งมอบไฟล์ที่ถูกติดตามที่ถูกดัดแปลงทั้งหมดแม้ว่าจะไม่ได้ถูกจัดฉากและไม่สนใจไฟล์ที่ไม่ได้ติดตาม


สิ่งนี้ไม่ทำงานเมื่อใช้ - แก้ไข
GhostCat

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.