วิธีการลบ. orig ไฟล์หลังจากผสานจากที่เก็บ git?


160

วิธีตรวจสอบไฟล์. orig ในที่เก็บ git ของฉันในระหว่างการรวมซึ่งตอนนี้จะแสดงในส่วนที่ถูกแก้ไขและไม่ได้ติดตาม แต่ฉันไม่ต้องการให้ไฟล์นี้ในที่เก็บของฉันอีกต่อไป วิธีการทำ

    modified:   Gemfile.lock.orig
    #   modified:   Gemfile.orig
    #   modified:   app/assets/images/bg_required.png.orig
    #   modified:   app/assets/javascripts/application.js.orig

    etc...

ความช่วยเหลือใด ๆ ที่จะได้รับการชื่นชม.



@ziu, ฉันต้องการลบไฟล์ที่มีอยู่แล้วในที่เก็บของฉัน, เช็คอินด้วย git merge หรือโดยผู้พัฒนาคนอื่น ๆ
maximus ツ

1
ฉันพลาดส่วนเกี่ยวกับไฟล์เช็คอิน อย่างไรก็ตามไฟล์. orig เขียนโดย mergetool ฟังดูเป็นการแก้ข้อขัดแย้งที่ไม่สะอาด
ziu

คุณต้องการลบไฟล์ออกจากประวัติทั้งหมดอย่างสมบูรณ์หรือไม่?
linquize

1
ตรวจสอบนี้stackoverflow.com/questions/872565/...
ziu

คำตอบ:


253

ทางออกที่ดีที่สุดในกรณีนี้คือการทำให้มันง่ายและกำจัดไฟล์เหล่านั้นโดยไม่เกี่ยวข้องกับคอมไพล์:

cd /your/repo/directory
find . -name '*.orig' -delete 

อีกวิธีหนึ่งใน Windows / PowerShell คุณสามารถเรียกใช้คำสั่งต่อไปนี้

cd \your\repo\directory
Get-ChildItem -Recurse -Filter '*.orig' | Remove-Item

14
หากคุณได้รับข้อผิดพลาดเพรดิเคตให้ใช้: ค้นหา -name '* .orig' | xargs rm -f
Neil

เช่นเดียวกับคำเตือนการใช้ 'find -delete' อาจเป็นอันตรายได้ โปรดตรวจสอบว่าไดเรกทอรี (ในกรณีนี้ '.') ถูกต้องเพื่อให้แน่ใจว่าคุณลบสิ่งที่คุณต้องการลบเท่านั้น
kingledion

8
มันเป็นความเจ็บปวดที่git clean -dfไม่ทำ ทำไมเราต้องล้างขยะด้วยตนเองที่ทิ้งไว้
Sridhar Sarnobat

แล้ว Windows ล่ะ
Panzercrisis

3
@Panzercrisis หากคุณใช้ Windows คุณอาจจะมีเทอร์มินัลอีมูเลเตอร์ซึ่งคุณเชื่อมต่อกับ Git อยู่แล้ว ฉันอยากจะแนะนำ "gitforwindows" ซึ่งมี BASH พร้อมเครื่องมือที่จำเป็นอื่น ๆ
TheChymera

151

ลองgit cleanข้อมูลเพิ่มเติมที่นี่หรือที่นี่


1
ฉันสามารถล้างไฟล์ที่ไม่ได้ติดตาม แต่สิ่งที่เกี่ยวกับการลบไฟล์ดังกล่าวที่มีอยู่แล้วในที่เก็บ
คติพจน์ツ

คุณต้องลบไฟล์ออกจากพื้นที่เก็บข้อมูลgit rm <filename>ก่อนจากนั้นส่งไฟล์. * นี้ไปไว้ในคอมไพล์ละเว้น
Amar

4
ฉันคิดว่านี่เป็นทางออกที่ดีกว่าคำตอบที่ทำเครื่องหมายไว้
Orgmir

51
git clean -iดีจริงๆ มันจะให้รายชื่อไฟล์ที่จะถูกลบและให้ตัวเลือกเกี่ยวกับวิธีจัดการกับรายการ (กรองรายการสามารถลบทุกอย่างในรายการและตัวเลือกอื่น ๆ )
PPPaul

1
คุณสามารถใช้ git clean ด้วยรูปแบบเพื่อช่วยลบไฟล์เฉพาะไฟล์ * .orig เท่านั้น: git clean -f -e '*.*' -e '!*.orig' มีรูปแบบยกเว้นเท่านั้น แต่มีการสนับสนุนเล็กน้อยสำหรับรูปแบบเชิงลบ ดังนั้นเราสามารถแยกไฟล์ทั้งหมด*.*แล้วปฏิเสธการแยก*.origไฟล์ได้
อ่าน


6

คุณสามารถละเว้นไฟล์โดยใช้. gignignore

เพียงใส่ * .orig ในรายการตามที่แสดงไว้ที่นี่

https://help.github.com/articles/ignoring-files

สำหรับการลบไฟล์ปัจจุบันคุณสามารถสร้างเชลล์สคริปต์และเรียกใช้จากโฟลเดอร์โครงการเช่นด้านล่าง

for file in `find *.orig -type f -print`
do
   echo "Deleting file $file"
   git rm $file -f       
done

5
แม้ว่าเขาจะสามารถทำสิ่งนี้ได้อย่างแน่นอนมันไม่ใช่สิ่งที่ถูกต้องที่จะทำที่นี่ :)
Sergio Tulentsev

1
ฉันคิดว่ามันเป็นความคิดที่ดีเพราะมันจะทำการสำรองข้อมูล แต่ไม่รบกวนไฟล์ที่จัดฉากไว้
akazemis

@akazemis - คุณคิดอย่างนั้น แต่เมื่อคุณ grepping สำหรับรหัสที่คุณเห็นสองเท่าของผลการค้นหาตามที่คุณต้องการ มันหายากมากที่ฉันอยากอยู่กับอันตรายที่ไม่มีไฟล์ต้นฉบับ มันจะดีกว่าที่จะกระทำอย่างสม่ำเสมอ
Sridhar Sarnobat

5

น่าเสียดายที่ใช้git cleanไม่ได้กับฉันเพราะฉันได้*.origเพิ่มไปยังไฟล์ gitignore ทั่วโลกของฉันดังนั้นพวกเขาจึงถูกละเว้นจากการทำความสะอาดเช่นกัน แม้กระทั่งวิ่งgit clean -xจะไม่ดีเพราะฉันไม่ต้องการให้ไฟล์ที่ถูกละเว้นทั้งหมดของฉันถูกลบ git clean -iมีประโยชน์ แต่จริง ๆ แล้วฉันไม่ต้องการตรวจสอบแต่ละไฟล์ทุกไฟล์

อย่างไรก็ตามเราสามารถใช้รูปแบบการยกเว้นและคัดค้านการแข่งขัน ดูตัวอย่างด้วยคำสั่งนี้:

git clean -e '!*.orig' --dry-run

จากนั้นเมื่อคุณมั่นใจ forceตั้งค่าสถานะเพื่อลบออกจริง ๆ :

git clean -e '!*.orig' -f

ขึ้นอยู่กับความคิดเห็นของ Leorleor


3

git rm Gemfile.lock.orig และส่วนที่เหลือของไฟล์ที่คุณไม่ต้องการ git commit --amend

เพื่อลบ blobs เหล่านั้นโดยสิ้นเชิง git gc --prune=0 --aggressive


@linquizebut คอมมิท git rm Gemfile.lock.orig จะใช้คอมมิชชันในการแก้ไขครั้งสุดท้ายใช่ไหม? มีวิธีอื่นที่จะไม่กระทำการใด ๆ กับไฟล์ดังกล่าวหรือไม่?
คติพจน์ツ

2

สำหรับฉัน git clean -fลบไฟล์ * .oig ทั้งหมด และทำให้คนที่เคยมีมาก่อนแล้ว

นี่คือสิ่งที่มัน (เกือบ) ดูเหมือนว่าหลังจากผสาน:

$ git status
On branch feature/xyz
Your branch is ahead of 'origin/feature/xyz' by 568 commits.
  (use "git push" to publish your local commits)

Untracked files:
  (use "git add <file>..." to include in what will be committed)

    .idea/codeStyles/
    .idea/misc.xml.orig

.idea/codeStyles/ มีอยู่แล้วก่อนที่จะรวมเป็นไฟล์ที่ไม่ได้ติดตาม .idea/misc.xml.orig(และอีกมากมาย) ต้องถูกลบออก

=> การใช้git clean -f:

$ git clean -f
Removing .idea/misc.xml.orig

ส่งผลให้:

$ git status
On branch feature/xyz
Your branch is ahead of 'origin/feature/xyz' by 568 commits.
  (use "git push" to publish your local commits)

Untracked files:
  (use "git add <file>..." to include in what will be committed)

    .idea/codeStyles/

0

คุณสามารถทำได้ git status -s | grep "\.orig$" | awk '{print $2}' | xargs -n1 -r echo rm

TL; DR;

git status -s อนุญาตให้คุณรับไฟล์ที่แก้ไข / หายไปทั้งหมดซึ่งเกี่ยวข้องกับดัชนี

grep "\.orig$" กรองไฟล์โดยคงตอนจบด้วย ".orig"

awk '{print $2}' แสดงรายชื่อไฟล์ (ข้ามข้อมูลคอมไพล์เช่น A, M, ??)

xargs -n1 -r echo rm พิมพ์คำสั่งลบในทุก ๆ อาร์กิวเมนต์ (-n1: ทีละครั้งและ -r: ข้ามเมื่อไม่มีข้อมูล) เพียงแค่คัดลอกและวางคำสั่งเพื่อตรวจสอบไฟล์ที่จะลบอีกครั้ง


แม้ว่าสิ่งนี้อาจตอบคำถามผู้แต่ง แต่ก็ไม่มีคำอธิบายและ / หรือลิงก์ไปยังเอกสารประกอบ ข้อมูลโค้ดดิบนั้นไม่ค่อยมีประโยชน์หากไม่มีวลีอยู่รอบตัว คุณอาจพบว่าวิธีเขียนคำตอบที่ดีมีประโยชน์มาก โปรดแก้ไขคำตอบของคุณ
สวัสดี

-4

git rm <file>

http://git-scm.com/docs/git-rm

เพิ่มไฟล์ / ไดเร็กตอรี่ที่คุณไม่ต้องการให้กับไฟล์. gitignore ของคุณ


git rm <file> <file>เพียงแค่รายการพวกเขา
veritas1

จากนั้นคุณต้องแสดงรายการไฟล์ทั้งหมดหรือใช้เครื่องมือเช่น find เพื่อส่งต่อไปยัง git rm หรือใช้ shell glob และวนรอบไฟล์เหล่านั้น Git ไม่ซ้ำซ้อนกับฟังก์ชั่นบรรทัดคำสั่ง Unix มาตรฐานนี้
mabraham

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