ไฟล์แผนผังการทำงานที่ไม่ได้ติดตามจะถูกเขียนทับโดยการรวม แต่ฉันไม่สนใจ


344

ที่สาขาของฉันฉันมีไฟล์บางไฟล์ใน. gitignore

ในสาขาอื่นไฟล์เหล่านั้นไม่ใช่

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

น่าเสียดายที่ฉันได้รับสิ่งนี้:

ไฟล์แผนผังการทำงานที่ไม่ได้ติดตามจะถูกเขียนทับโดยการรวม

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




1
สำเนาที่เป็นไปได้ของไฟล์
แผนผัง

1
นี่เป็นคำตอบที่ดีที่สุดเนื่องจากจะลบไฟล์ที่บล็อกคุณจากการรวมเท่านั้น: stackoverflow.com/a/52255219/551045
RedX

คำตอบ:


539

ปัญหาคือคุณไม่ได้ติดตามไฟล์ในเครื่อง แต่ไฟล์ที่เหมือนกันจะถูกติดตามจากระยะไกลดังนั้นเพื่อ "ดึง" ระบบของคุณจะถูกบังคับให้เขียนทับไฟล์ในเครื่องที่ไม่ได้ควบคุมเวอร์ชัน

ลองวิ่ง

git add * 
git stash
git pull

วิธีนี้จะติดตามไฟล์ทั้งหมดลบการเปลี่ยนแปลงในเครื่องทั้งหมดของคุณไปยังไฟล์เหล่านั้นจากนั้นรับไฟล์จากเซิร์ฟเวอร์


59
git add -A .; git stashทำงานให้ฉัน git add *ตัวแปรบ่นเกี่ยวกับการละเว้นเส้นทาง
imsky

11
ฉันพยายามเพิ่มคอมไพล์., ซ่อนคอมไพล์, ดึงคอมไพล์. มันใช้งานได้ แต่ฉันก็ยังไม่เข้าใจว่าทำไม
ARK

1
สำหรับฉันฉันมีไฟล์ระยะไกลซึ่งถูกติดตามและฉันมีไฟล์ชื่อเดียวกันใน repo ในพื้นที่ซึ่งไม่ได้ทำการติดตาม ดังนั้นหากคุณเพิ่มไฟล์โลคัลซ่อนการเปลี่ยนแปลงจากนั้นดึงไฟล์รีโมตควรเขียนทับไฟล์โลคัล
userFog

2
นี่คือลิงค์ที่ดีที่จะเข้าใจวิธีการทำงานของมันหากใครสนใจ git-scm.com/book/en/v1/Git-Tools-Stashing
James M. Lay

2
//, สิ่งนี้ไม่ได้ไปไกลเกินกว่าจุดประสงค์ของข้อผิดพลาดนี้จริงๆ
Nathan Basanese

137

คุณสามารถลองใช้คำสั่งเพื่อล้างไฟล์ที่ไม่ได้ติดตามจากโลคัล

Git 2.11 และรุ่นที่ใหม่กว่า:

git clean  -d  -f .

Git รุ่นที่เก่ากว่า:

git clean  -d  -f ""

ไหน-dสามารถถูกแทนที่ด้วยต่อไปนี้:

  • -x ไฟล์ที่ถูกเพิกเฉยจะถูกลบด้วย

  • -d ลบไดเรกทอรีที่ไม่ได้ติดตามนอกจากไฟล์ที่ไม่ได้ติดตาม

  • -f จำเป็นต้องบังคับให้เรียกใช้

นี่คือลิงค์ที่มีประโยชน์เช่นกัน


23
ฉันจะเพิ่ม-iสำหรับโหมดโต้ตอบ เช่นเดียวกับการลบไดเรกทอรีที่ไม่พึงประสงค์ฉันยังเพิ่งลบการตั้งค่าผู้ใช้ของฉันสำหรับโครงการ :-(
dumbledad

6
มันคุ้มค่าที่จะสแกนผ่านความคิดเห็นเพื่อหาคำตอบที่คล้ายกันซึ่ง-xอาจเป็นอันตรายได้
dumbledad

10
แต่นี่เป็นงานที่อันตรายมากและไม่สามารถยกเลิกได้ !! คุณอาจสูญเสียไฟล์จำนวนมาก! ระวัง!!
Mohamed Kawsara

16
นี้ถูกลบทั้งหมดของฉันผู้ขายไดเรกทอรีบนบางกรอบ ระวังคำสั่งนี้มาก
RousseauAlexandre

2
คุณควรลบ 'x' ออกจากคำตอบของคุณ มันอันตรายมาก!
earl3s

107

คำสั่งเดียวที่ใช้ได้กับฉันคือ:

git fetch --all
git reset --hard origin/{{your branch name}}

5
ควรสังเกตว่าคำตอบนี้จำเป็นถ้าคุณลบ submodules และอ่านมันเป็นไลบรารีใน repo ดั้งเดิม ฉันต้องการคำตอบและนี่คือทั้งหมดที่ได้ผล
Routhinator

ฉันไม่ได้มี submodules และพยายามทำความสะอาดและเก็บซ่อนคอมไพล์ตามคำแนะนำในคำตอบอื่น ๆ แต่เพียงช่วยนี้
kslstn

หลังจากเคลียร์ซับโดดูลที่หลากหลายนี่เป็นสิ่งเดียวที่ใช้ได้สำหรับฉันเช่นกัน จากบันทึกพิเศษฉันมีปัญหาเรื่องความไวของตัวพิมพ์เล็กและไฟล์ อดีต XML.php ถึง Xml.php ในโฟลเดอร์ผู้ขายของฉันจากผู้แต่ง
KazaJhodo

1
มันก็ใช้ได้สำหรับฉันเช่นกัน คุณช่วยอธิบายสิ่งที่เกิดขึ้นได้ไหม ฉันไม่เข้าใจ
Dimitris Karamanis

1
สิ่งนี้ลบการผูกพันในท้องถิ่นของฉันสองรายการก่อนที่จะใช้สิ่งนี้!
David Cian

27

การแทนที่git mergeที่จะเขียนทับไฟล์ที่ไม่ได้ติดตาม

ความคิดเห็นด้านล่างใช้ 'FOI' สำหรับ 'ไฟล์ที่น่าสนใจ' ซึ่งเป็นไฟล์ที่

  • มีอยู่ในสาขาผู้บริจาค
  • ไม่มีอยู่ในสาขาที่รับ
  • และกำลังบล็อกการผสานเนื่องจากมีอยู่และไม่ได้ติดตามในไดเรกทอรีทำงานของคุณ
git checkout -f donor-branch   # replace FOI with tracked `donor` versions
git checkout receiving-branch  # FOI are not in `receiving`, so they disapppear
git merge donor-branch  # now the merge works

การแทนที่git pullที่จะเขียนทับไฟล์ที่ไม่ได้ติดตาม

pull = fetch + mergeดังนั้นเราจึง git fetchตามด้วยgit checkout -f, git checkout, git mergeเคล็ดลับข้างต้น

git fetch origin  # fetch remote commits
git checkout -f origin/mybranch  # replace FOI with tracked upstream versions
git checkout mybranch  # FOI are not in mybranch, so they disapppear
git merge origin/mybranch  # Now the merge works. fetch + merge completes the pull.

คำอธิบายโดยละเอียด

git merge -fไม่ได้มีอยู่ แต่git checkout -fไม่

เราจะใช้git checkout -f+ git checkoutเพื่อลบไฟล์ที่น่าสนใจ (ดูด้านบน) จากนั้นการผสานของคุณสามารถดำเนินการตามปกติ

ขั้นตอนที่ 1 ขั้นตอนนี้บังคับให้แทนที่ FOI ที่ไม่ได้ติดตามซึ่งมีรุ่นติดตามของสาขาผู้บริจาค (มันจะตรวจสอบสาขาผู้บริจาค

git checkout -f donor-branch

ขั้นตอนที่ 2 ขั้นตอนนี้จะลบ FOI ออกเนื่องจากพวกเขาถูกติดตามในสาขาปัจจุบันของเรา (ผู้บริจาค) และหายไปเมื่อreceiving-branchเราเปลี่ยนเป็น

git checkout receiving-branch

ขั้นตอนที่ 3เมื่อ FOI ขาดหายไปการรวมในสาขาผู้บริจาคจะไม่เขียนทับไฟล์ที่ไม่ได้ติดตามใด ๆ ดังนั้นเราจึงไม่มีข้อผิดพลาด

git merge donor-branch

3
นี่มันสะอาดเกินกว่าจะเป็นคำตอบที่ 7 หรือ 8!
Majed DH

1
ขอบคุณ @MajedDH คุณทำให้วันของฉัน! <3
Esteis

1
นี่คือ instafix ที่ฉันกำลังมองหา! ขอบคุณ
AFM-Horizon

ยินดีที่ได้ช่วยคุณ @ AFM-Horizon!
Esteis

20

ลบไฟล์ที่ไม่ได้ติดตามทั้งหมด:

git clean  -d  -fx .

8
การลบไฟล์ที่อาจใช้ในโครงการไม่ควรเป็นทางออกที่แท้จริง
ErdinçÇorbacı

4
yikes, ทำความสะอาดไฟล์ IDE ด้วย :(
kisna

18

หากเป็นการดำเนินการครั้งเดียวคุณสามารถลบไฟล์ที่ไม่ได้ติดตามทั้งหมดออกจากไดเรกทอรีการทำงานก่อนที่จะทำการดึง อ่านวิธีการลบไฟล์ในเครื่อง (ไม่ได้ติดตาม) ออกจากแผนผังการทำงาน Git ปัจจุบัน สำหรับข้อมูลเกี่ยวกับวิธีลบไฟล์ที่ไม่ได้ติดตามทั้งหมด

อย่าลืมลบไฟล์ที่ไม่ได้ติดตามซึ่งคุณยังคงต้องการโดยไม่ได้ตั้งใจ)


15

คุณสามารถลองใช้คำสั่งนั้น

git clean -df

5
การใช้การลบไดเรกทอรีที่ไม่ได้ติดตามไม่ได้คืออะไร .. พวกมันมีค่าคุณรู้
zhekaus

คุณช่วยอธิบายสิ่งที่มันทำ?
Safak Ozkan

12

อัพเดท - รุ่นที่ดีกว่า

เครื่องมือนี้ ( https://github.com/mklepaczewski/git-clean-before-merge ) จะ:

  • ลบไฟล์ที่ไม่ได้ติดตามซึ่งเหมือนกับไฟล์ที่git pullเทียบเท่า
  • ย้อนกลับการเปลี่ยนแปลงไฟล์ที่แก้ไขซึ่งเวอร์ชั่นที่แก้ไขนั้นจะเหมือนกับไฟล์ที่git pullเทียบเท่า
  • รายงานไฟล์ที่ถูกแก้ไข / ไม่ได้ติดตามซึ่งแตกต่างจากgit pullเวอร์ชั่น
  • เครื่องมือมี--pretendตัวเลือกที่จะไม่แก้ไขไฟล์ใด ๆ

เวอร์ชั่นเก่า

คำตอบนี้แตกต่างจากคำตอบอื่นอย่างไร

วิธีการนำเสนอที่นี่จะลบเฉพาะไฟล์ที่จะถูกเขียนทับโดยการผสาน หากคุณมีไฟล์อื่น ๆ ที่ไม่ได้ติดตาม (อาจถูกละเว้น) ในไดเรกทอรีวิธีนี้จะไม่ลบออก

การแก้ไขปัญหา

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

git pull 2>&1|grep -E '^\s'|cut -f2-|xargs -I {} rm -rf "{}"

และจากนั้นทำ:

git pull

นี่ไม่ใช่คำสั่ง git Porcelain ดังนั้นให้ตรวจสอบอีกครั้งว่ามันจะทำอะไรกับ:

git pull 2>&1|grep -E '^\s'|cut -f2-|xargs -I {} echo "{}"

คำอธิบาย - เนื่องจากมีหนึ่ง liners ที่น่ากลัว:

นี่คือรายละเอียดของสิ่งที่ทำ:

  1. git pull 2>&1- การจับภาพgit pullการส่งออกและเปลี่ยนเส้นทางไปทุกที่ stdout grepเพื่อให้เราสามารถจับภาพได้อย่างง่ายดายด้วย
  2. grep -E '^\s- git pullความตั้งใจคือการจับรายชื่อของไฟล์ที่ไม่ได้ติดตามที่จะถูกเขียนทับโดย ชื่อไฟล์มีอักขระช่องว่างอยู่ข้างหน้าดังนั้นเราจึงใช้มันเพื่อให้ได้มา
  3. cut -f2- - ลบช่องว่างออกจากจุดเริ่มต้นของแต่ละบรรทัดที่จับใน 2
  4. xargs -I {} rm -rf "{}"- ให้เราวนxargsซ้ำไฟล์ทั้งหมดบันทึกชื่อไว้ใน "{}" และเรียกrmใช้ไฟล์แต่ละไฟล์ เราใช้-rfเพื่อบังคับลบและลบไดเรกทอรีที่ไม่ได้ติดตาม

มันจะเป็นการดีมากที่จะแทนที่ขั้นตอนที่ 1-3 ด้วยคำสั่งเครื่องเคลือบ แต่ฉันไม่ได้ตระหนักถึงสิ่งที่เทียบเท่า


ขอบคุณฉันมักจะมีไฟล์ที่ไม่ได้ติดตามในไดเรกทอรีการทำงานของฉันซึ่งฉันไม่ต้องการลบหรือยืนยัน ในกรณีของฉันฉันต้องแทนที่git pullด้วยgit checkout <branch_name>
mihow

6

หากคุณพิจารณาใช้-fแฟล็กคุณอาจเรียกใช้เป็นรันไทม์ เพียงแค่คุณรู้ล่วงหน้าว่าสถานการณ์ที่น่าสนใจแบบไหนที่คุณจะต้องทำต่อไป ;-P

-n 
--dry-run 
    Don’t actually remove anything, just show what would be done.

6

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

git clean -f '/path/to/file/'

อย่าลืมรันด้วยแฟล็ก -n ก่อนหากคุณต้องการดูว่าไฟล์ใดที่ git clean จะลบออก โปรดทราบว่าไฟล์เหล่านี้จะถูกลบ ในกรณีของฉันฉันไม่ได้สนใจพวกเขาต่อไปดังนั้นนี่จึงเป็นทางออกที่ดีกว่าสำหรับฉัน


5

วิธีหนึ่งในการทำเช่นนี้คือการหยุดการเปลี่ยนแปลงในเครื่องของคุณและดึงจาก repo ระยะไกล ด้วยวิธีนี้คุณจะไม่สูญเสียไฟล์ในเครื่องเนื่องจากไฟล์จะไปที่ซ่อน

git add -A
git stash
git pull

คุณสามารถตรวจสอบไฟล์ที่เก็บในเครื่องของคุณโดยใช้คำสั่งนี้ - git stash list


4

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

ฉันพบปัญหานี้เมื่อฉันเปลี่ยนชื่อโฟลเดอร์จาก "Petstore" เป็น "petstore" (ตัวพิมพ์ใหญ่เป็นตัวพิมพ์เล็ก) ฉันได้แก้ไขไฟล์. git / config ของฉันเพื่อหยุดการเพิกเฉยต่อกรณีทำการเปลี่ยนแปลงบีบการกระทำของฉันและเก็บการเปลี่ยนแปลงเพื่อย้ายไปยังสาขาอื่น ฉันไม่สามารถใช้การเปลี่ยนแปลงที่เก็บไว้กับสาขาอื่นนี้ได้

การแก้ไขที่ฉันพบว่าใช้งานได้คือการแก้ไขไฟล์. git / config ของฉันชั่วคราวเพื่อละเว้นกรณีและปัญหาชั่วคราวอีกครั้ง สิ่งนี้ทำให้git stash applyสำเร็จ จากนั้นฉันเปลี่ยน ignCase กลับไปfalseเป็น ฉันเพิ่มทุกอย่างยกเว้นไฟล์ใหม่ในโฟลเดอร์ petstore ซึ่งคอมไพล์ที่อ้างว่าผิดปกติถูกลบไม่ว่าด้วยเหตุผลใดก็ตาม ฉันยืนยันการเปลี่ยนแปลงของฉันจากนั้นจึงวิ่งgit reset --hard HEADเพื่อกำจัดไฟล์ใหม่ที่ไม่ได้ติดตาม ความมุ่งมั่นของฉันปรากฏตามที่คาดไว้: ไฟล์ในโฟลเดอร์ถูกเปลี่ยนชื่อ

ฉันหวังว่านี่จะช่วยให้คุณหลีกเลี่ยงฝันร้ายเดียวกันได้


ไม่ได้ผลสำหรับฉัน ฉันลบไฟล์ทั้งหมดในโฟลเดอร์ จากนั้นแล้วgit pull -f git checkout .ช่างฝันร้ายอะไร
m.rufca

จริงๆ? มันใช้งานได้ดีสำหรับฉันเพียงไม่กี่สัปดาห์ที่ผ่านมา คุณลองแก้ไขไฟล์ gitconfig เพื่อเริ่ม / หยุดโดยไม่สนใจขนาดตัวพิมพ์หรือไม่?
A. Davidson

ขอบคุณ. ฉันต้องการผสานจากต้นแบบหลังจากแก้ไขโครงในเส้นทางโฟลเดอร์ ฉันสามารถรวมมันเข้ากับ git ละเว้น case on หลังจากนั้นฉันเพิ่งเปิดใช้งานความไวของ case
Rubenisme

3

ทั้งการทำความสะอาด / รีเซ็ต / การชำระเงิน / คืนยากสำหรับฉัน

ดังนั้นฉันเพิ่งลบไฟล์ที่คอมไพล์บ่นเกี่ยวกับ *

rm /path/to/files/that/git/complained/about

* ฉันตรวจสอบว่าไฟล์นี้สามารถลบได้โดยการตรวจสอบ repo ใหม่ในโฟลเดอร์แยกต่างหาก (ไฟล์ไม่ได้อยู่ที่นั่น)


1

ในกรณีของฉันเมื่อฉันมีปัญหานี้ ฉันมีไฟล์ในเครื่องที่ฉันได้เปลี่ยนชื่อบนรีโมต

เมื่อพยายามที่จะgit pullGit บอกฉันว่าชื่อไฟล์ใหม่ไม่ได้ติดตาม - ซึ่งมันอยู่ในระยะไกลแม้ว่ามันจะยังไม่ได้อยู่ในท้องถิ่น

เพราะไม่มีตัวอย่างในนั้นฉันไม่สามารถทำอะไรได้git pullจนกว่าฉันจะทำgit rmในชื่อไฟล์เก่า (ซึ่งไม่ชัดเจนในตอนแรกเพราะความคิดที่โง่ของฉันในการเปลี่ยนชื่อ)


0

หากคุณมีไฟล์ที่เขียนภายใต้. gignignore ให้ลบไฟล์และเรียกใช้ git pull อีกครั้ง นั่นช่วยฉันออก


0

ปัญหาคือเมื่อเรามีการเปลี่ยนแปลงที่เข้ามาซึ่งจะรวมไฟล์ที่ไม่ได้ติดตามมาคอมไพล์ก็บ่น คำสั่งเหล่านี้ช่วยฉัน:

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