การใช้ git ฉันจะเพิกเฉยต่อไฟล์ในสาขาใดสาขาหนึ่ง แต่มีการคอมมิทในสาขาอื่นได้อย่างไร?


157

ฉันมีโครงการที่ผมนำไปใช้กับHeroku ทรีซอร์สโค้ดประกอบด้วยไฟล์ mp3 จำนวนมาก (เว็บไซต์จะใช้สำหรับโครงการบันทึกที่ฉันเกี่ยวข้องอย่างมาก)

ฉันต้องการวางซอร์สโค้ดสำหรับGitHubแต่ GitHub มีขีด จำกัด 300 MB สำหรับบัญชีฟรี ฉันไม่ต้องการใช้ขีด จำกัด 50 MB กับไฟล์ mp3 จำนวนมาก เห็นได้ชัดว่าฉันสามารถเพิ่มพวกเขาลงใน.gitignoreไฟล์เพื่อป้องกันพวกเขาออกจาก repo ของฉัน

แต่ผมใช้กับ Heroku git push herokuใช้ ไฟล์ mp3 จะต้องมีอยู่ในสาขาที่ฉันกดเพื่อ Heroku เพื่อให้พวกเขาได้รับการใช้งาน

เป็นการดีที่ฉันต้องการ.gitignoreไฟล์ MP3 ในสาขาท้องถิ่นของฉันเพื่อที่เมื่อฉันผลักไฟล์นั้นไปที่ GitHub ไฟล์ MP3 จะไม่รวมอยู่ด้วย จากนั้นฉันก็จะรักษาสาขาการผลิตในท้องถิ่นที่มี mp3 ที่มุ่งมั่นแทนที่จะเพิกเฉย ในการปรับใช้ฉันจะผสานต้นแบบเข้ากับการผลิตแล้วผลักสาขาการผลิตไปที่ Heroku

ฉันไม่สามารถทำงานให้ถูกต้องได้

นี่คือตัวอย่างของสิ่งที่ฉันพยายามทำ ...

$ git init git-ignore-test
$ cd git-ignore-test
$ echo "*.ignored" >> .gitignore
$ git add .gitignore && git commit -m "Ignore .ignored files"
$ touch Foo.ignored

ณ จุดนี้ Foo.ignored ถูกละเว้นในสาขาหลักของฉัน แต่ยังคงมีอยู่ดังนั้นโครงการของฉันจึงสามารถใช้งานได้

$ git checkout -b unignored
$ cat /dev/null > .gitignore
$ git add Foo.ignored .gitignore && git commit -m "Unignore .ignored files"

ตอนนี้ฉันได้สาขาที่มีไฟล์เหล่านี้มุ่งมั่นตามที่ฉันต้องการ อย่างไรก็ตามเมื่อฉันเปลี่ยนกลับเป็นสาขาหลักของฉัน Foo.ignored จะหายไป

ใครมีคำแนะนำสำหรับวิธีที่ดีกว่าในการตั้งค่านี้

แก้ไข: เพียงเพื่อชี้แจงฉันต้องการไฟล์ mp3 ที่จะปรากฏในทั้งสองสาขาเพื่อให้เมื่อฉันเรียกใช้เว็บไซต์ในประเทศ (โดยใช้สาขาใดสาขาหนึ่ง) เว็บไซต์ทำงาน ฉันแค่ต้องการให้ไฟล์ถูกละเว้นในสาขาเดียวดังนั้นเมื่อฉันกดไปที่ GitHub พวกเขาก็ไม่ได้ถูกผลักเช่นกัน โดยปกติ. gignignore ทำงานได้ดีสำหรับสิ่งนี้ (เช่นการเก็บสำเนาของไฟล์ที่ไม่ได้รวมอยู่ในการผลักดันไปยังระยะไกล) แต่เมื่อฉันสลับไปที่สาขาด้วยไฟล์ที่เช็คอินแล้วกลับไปที่ สาขาที่ไฟล์ถูกละเว้นไฟล์จะหายไป


ทำไมไฟล์เพลง MP3 ที่เคยจะต้องมีการมุ่งมั่นที่จะเก็บ?
Dan Loewenherz

4
เมื่อใช้ heroku การทำธุรกรรมซื้อคืนของคุณเป็นวิธีเดียวที่จะได้รับไฟล์ที่รวมอยู่ในแอพของคุณเมื่อคุณปรับใช้ ทางเลือกเดียวคือใช้บางอย่างเช่น Amazon S3 เพื่อให้บริการ mp3 แต่ฉันต้องการหลีกเลี่ยงสิ่งนั้น
Myron Marston

ดูเหมือนคุณกำลังสะดุดดอลลาร์เพื่อประหยัดเงิน ... ความ Rackspace Cloud เป็นเรื่องง่ายมากที่จะได้รับการติดตั้งบนและมันจะมีค่าใช้จ่ายน้อยมากที่จะเก็บ <1 GB ไฟล์มี ...
gahooa

3
ฉันสังเกตเห็นว่าคุณทำเครื่องหมายคำตอบว่าถูกต้อง แต่จากสิ่งที่ฉันอ่านอาจไม่ถูกต้อง คุณเคยลองใช้คำตอบจริง ๆ แล้วมันได้ผลใช่ไหม?
วนรอบ

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

คำตอบ:


84

วิธีนี้ดูเหมือนว่าจะใช้ได้เฉพาะกับ git รุ่นที่ได้รับการติดตั้งแล้วเท่านั้น ดูคำตอบใหม่ที่ชี้ไปที่วิธีแก้ปัญหาและคำตอบอื่นและความคิดเห็นที่ตามมาสำหรับคำใบ้ว่าเวอร์ชันใดที่อาจใช้

ฉันเขียนโพสต์บล็อกเกี่ยวกับวิธีการใช้อย่างมีประสิทธิภาพexcludesfileสำหรับสาขาที่แตกต่างกันเช่นหนึ่งสำหรับ GitHub สาธารณะและอีกหนึ่งสำหรับการติดตั้ง Heroku

นี่คือความรวดเร็วและสกปรก:

$ git branch public_viewing
$ cd .git/
$ touch info/exclude_from_public_viewing
$ echo "path/to/secret/file" > info/exclude_from_public_viewing 

จากนั้นในไฟล์. git / config เพิ่มบรรทัดเหล่านี้:

[core]
excludesfile = +info/exclude


[branch "public_viewing"]
excludesfile = +info/exclude_from_public_viewing

ตอนนี้สิ่งที่ไม่สนใจโกลบอลทั้งหมดอยู่ในinfo/excludeไฟล์และมีสาขาเฉพาะอยู่ในinfo/exclude_from_public_viewing

หวังว่าจะช่วย!

http://cogniton-mind.tumblr.com/post/1423976659/howto-gitignore-for-different-branches


1
ขออภัยที่ใช้เวลานานมาก .. แต่ถ้าคุณไม่ลบไฟล์. gitignore มันจะเริ่มต้นที่ไฟล์เหล่านั้นก่อน
ความรู้ความเข้าใจ

4
สิ่งนี้ไม่ได้ผลสำหรับฉันแม้ว่าโครงการจะไม่ใช้. gitignore คุณทราบหรือไม่ว่าให้คำสั่งการถอดเสียงคำสั่งตั้งค่านี้ตั้งแต่ต้น ( git init, ... ) และรุ่น Git ที่คุณใช้?
Davor Cubranic

34
วิธีนี้ไม่ทำงาน มีการพูดคุยกันในบล็อกและไม่มีใครสามารถทำสิ่งนี้ได้เช่นกัน
spuder


2
ในวานิลลา Git ฉันค่อนข้างมั่นใจว่านี่ไม่ทำงานและไม่เคยทำ ผู้ที่ทำซ้ำสิ่งนี้คุณสามารถแบ่งปันเวอร์ชัน Git และข้อมูลอื่น ๆ ที่เกี่ยวข้องกับสภาพแวดล้อมของคุณได้หรือไม่? บางทีคุณอาจมีรุ่นที่ได้รับการแก้ไขจากผู้ดูแลแพคเกจ Git ของคุณ
Palec

20

คำใบ้สำคัญ : คำตอบที่ยอมรับโดย Cognition.Mind ไม่ทำงาน (อีกต่อไปเป็นเวลาหลายปีในขณะนี้หรือบางทีสำหรับ git รุ่นของวานิลลา); ดูความคิดเห็น คำตอบที่ถูกต้องและวิธีแก้ปัญหาสามารถพบได้ที่นี่:

https://stackoverflow.com/a/29583813/2157640

วิธีแก้ปัญหาอีกทางเลือก (ที่ทำงานให้กับปัญหาที่เกิดขึ้นโดยเฉพาะอย่างยิ่งของฉัน แต่เรียกร้องให้การดำเนินงานสะสมด้วยตนเองหรือการดำเนินงานของเบ็ด) git stash -u -aจะเป็น นี่เป็นเรื่องน่าเบื่อเมื่อความแตกต่างมีขนาดใหญ่

และในที่สุดวิธีการแก้ปัญหาที่ฉันกำลังดำเนินอยู่ก็คือการแยก VM ของฉันที่เราจัดไว้ให้กับสภาพแวดล้อมการพัฒนาของเราและตั้งค่าinfo/excludesอย่างเหมาะสมสำหรับสาขาตามลำดับการลบไฟล์ / โฟลเดอร์ที่ไม่เหมาะสม


14

ฉันขอแนะนำอย่างยิ่งให้พิจารณาวางไฟล์ MP3 เหล่านั้นใน S3 การที่พวกเขาเป็นส่วนหนึ่งของการผลัก Heroku ของคุณ (และเป็นส่วนหนึ่งของกระสุน Heroku ของคุณ) จะชะลอเวลาการเริ่มต้น Dyno ของคุณอย่างมาก เนื่องจาก Heroku ใช้ EC2 หากไฟล์อยู่ใน S3 และเข้าถึงได้โดยแอปของคุณเท่านั้น (หากผู้ใช้ไม่ได้เชื่อมโยงโดยตรงกับ S3) คุณจะไม่ต้องจ่ายค่าใช้จ่ายแบนด์วิดท์เลยแม้แต่ค่าใช้จ่ายในการจัดเก็บ 50MB


13

สมมติว่าเราต้องการละเว้นbuildโฟลเดอร์จากสาขาอื่นทั้งหมดยกเว้นproductionสาขา ตามที่เราต้องการที่จะผลักดันbuildโฟลเดอร์ในการผลิต

1) อย่ารวมbuildใน. gitignore หากคุณทำเช่นนั้นมันจะถูกละเว้นสำหรับทุกสาขา

2) สร้างไฟล์exclude_from_public_viewingภายใน./.git/info(โฟลเดอร์นี้มีอยู่แล้ว) โฟลเดอร์touch ./.git/info/exclude_from_public_viewing

3) ภายในexclude_from_public_viewingเขียนหนึ่งบรรทัด (ในขณะที่คุณพยายามที่จะละเว้นbuildสำหรับสาขาทั้งหมด) !build

4) .git/info/excludeมีไฟล์ที่มีอยู่เป็น เราจำเป็นต้องเพิ่มบรรทัดต่อไปนี้ในนั้น

 build

เราต้องการละเว้นbuildโฟลเดอร์ แต่ไม่ได้เพิ่มไว้ใน. gitignore ดังนั้น git จะรู้ได้อย่างไรว่าจะละเว้นอะไร? คำตอบคือเรากำลังเพิ่มลงในexcludeไฟล์และส่งไฟล์นั้นไปตามเงื่อนไขอย่างมีเงื่อนไขgit config

5) ตอนนี้เราต้องยกเลิกการลงทะเบียนbuildโฟลเดอร์แบบมีเงื่อนไขสำหรับproductionสาขา เพื่อทำสิ่งต่อไปนี้

6) มีไฟล์ที่มีอยู่ที่เรียกว่า./.git/configเราต้องเพิ่มต่อไปนี้ -

a) excludesfile = +info/excludeด้านล่าง[core]

[core]
     excludesfile = +info/exclude

ข) การสร้างส่วนใหม่ในตอนท้ายของการ./.git/configเป็น

[branch "production"]
    excludesfile = +info/exclude_from_public_viewing

โซลูชันที่ 2

มีทางเลือกหนึ่งทางเลือกอันชาญฉลาด ให้บอกว่าคุณต้องการเพิ่มbuild/โฟลเดอร์ในproductionสาขาและเพิกเฉยในสาขาอื่นทั้งหมด

1) เพิ่มลงในgitignoreไฟล์ของคุณ

2) ในสาขาการผลิตในขณะที่ทำgit addบังคับให้เพิ่มbuildโฟลเดอร์:git add -f --all build/


และสิ่งนี้แตกต่างจากโซลูชันที่ยอมรับได้อย่างไร คุณทดสอบกับคอมไพล์เวอร์ชันใด? เนื่องจากคำตอบที่เชื่อมโยงระบุว่าล้มเหลวเนื่องจากไม่มีการสนับสนุนbranch.<name>.excludesfileใน git (อีกต่อไป?) เพียงเพื่อcore.excludesfileและการทดสอบของฉันเองดูเหมือนจะยืนยันเรื่องนี้
Murphy

@Murphy มันใช้งานได้ดีgit version 2.7.4 (Apple Git-66)และฉันไม่ได้ใช้branch.<name>.excludesfile ในการแก้ปัญหาของฉัน
sapy

4
@sapy: ฉันลองทำตามกรณีการใช้งานของ OP และไฟล์ยังคงหายไปเมื่อฉันเปลี่ยนจากการใช้งานจริงเป็นหลัก โปรดทราบว่าโฟลเดอร์ "สร้าง" ควรถูกส่งไปยังสาขา "การผลิต" (นอกจากนี้ฉันทราบว่าถ้าฉันไม่ยอมรับโฟลเดอร์ "สร้าง" ในสาขา "การผลิต" สาขา "การผลิต" จะไม่สนใจโฟลเดอร์ "สร้าง" ซึ่ง ได้แก่ [สาขา "การผลิต"] ไม่รวม config config ไม่ได้ ไม่ทำงาน) ฉันใช้ git เวอร์ชันเดียวกับคุณ ฉันยังพยายาม [สาขา "การผลิต"] แนวทางการละเว้นไฟล์เฉพาะในสาขาการผลิตก็ยังไม่ทำงานเช่นเมอร์ฟี่กล่าวว่า
justhalf

โซลูชันที่ 2 คือสิ่งที่ฉันกำลังมองหา ขอบคุณ!
Vyacheslav Cotruta

4

คุณเคยลอง. gitignore แตกต่างในสาขาของคุณหรือไม่?

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


6
ฉันลองแล้ว หากคุณดูคำสั่งที่ฉันโพสต์ไว้ด้านบนคุณจะเห็นว่าเป็นสิ่งที่ฉันทำ ปัญหาคือเมื่อฉันเปลี่ยนจากสาขาด้วยไฟล์ที่เช็คอินเป็นสาขาโดยไม่สนใจไฟล์ git จะทิ้งไฟล์เหล่านั้น ฉันต้องการเก็บ mp3 ในสาขาหลักของฉันเพื่อให้เว็บไซต์ทำงานอย่างถูกต้องในโหมด dev แม้ว่าไฟล์จะถูกละเว้น
Myron Marston

1
เขาพูดแล้วนั่นคือสิ่งที่เขาทำ บางทีการลบคำตอบนี้อาจจะดีที่สุด :-) สิ่งที่ทำให้ไขว้เขว
blamb

3

1. สรุป

  1. ฉันใช้Travis CIสำหรับการปรับใช้ ( รองรับการปรับใช้ Heroku )
  2. ฉันเพิ่มของฉัน.travis.yml:

    before_deploy:
    - mv misc/.gitignore .gitignore

    อยู่ที่ไหนmisc- โฟลเดอร์ใด ๆ .gitignoreมีอีก

    mvย้ายไฟล์คำสั่ง UNIX ; เขียนทับหากไฟล์มีอยู่แล้ว

เมื่อ Travis CI ปรับใช้โครงการ Travis CI จะไม่ผลักดันการปรับใช้ไฟล์และโฟลเดอร์ของผู้ให้บริการที่ไม่สนใจmisc/.gitignore(ไม่ใช่ในต้นฉบับ.gitignoreของแหล่งที่มา)


2. ข้อ จำกัด

  1. คำตอบนี้อาจไม่เหมาะกับทุกเงื่อนไขของผู้เขียน แต่คำตอบนี้ตอบคำถามที่ว่า "ใช้ git ฉันจะเพิกเฉยต่อไฟล์ในสาขาใดสาขาหนึ่งได้หรือไม่ แต่ได้คอมมิทไปที่สาขาอื่น"
  2. ฉันไม่ใช่ผู้ใช้ Heroku ตัวอย่างสำหรับGitHubไม่ใช่สำหรับ Heroku ข้อมูลของคำตอบนี้ใช้ได้กับฉันใน GitHub แต่อาจใช้ไม่ได้กับ Heroku

3. ความเกี่ยวข้อง

คำตอบนี้มีความเกี่ยวข้องสำหรับเมษายน 2018 ในอนาคตข้อมูลของคำตอบนี้อาจล้าสมัย


4. การสาธิต

ฉันโครงการจริง

ตัวอย่างของการใช้งานที่ประสบความสำเร็จ

4.1 งาน

ฉันปรับใช้โครงการของฉันจากสาขา src เพื่อ dest สาขาของที่เก็บเดียวกัน

ฉันต้องการไฟล์นั้นPaletteMira.suricate-profile:

  • Local machine - มีอยู่สำหรับทุกสาขา
  • src remote branch - ไม่มีอยู่
  • ปลายทางปลายทางระยะไกล - มีอยู่

หากฉันเข้าใจผู้แต่งคำถามอย่างถูกต้องเขาก็มีงานที่คล้ายกัน

4.2 src

สาขาแหล่งที่มา - SashaYAML

ส่วนหนึ่งของ.travis.yml:

before_deploy:
- mv misc/.gitignore .gitignore

deploy:
  provider: pages
  on:
    branch: SashaYAML
  keep-history: true
  skip-cleanup: true
  target-branch: SashaDevelop
  repo: Kristinita/PaletteMira
  github-token: $GITHUB_TOKEN
  committer-from-gh: true
  project-name: PaletteMira
verbose: true

ส่วนหนึ่งของ.gitignore:

*.sublime-snippet
*.suricate-profile

เป็นส่วนหนึ่งของ misc/.gitignore

*.sublime-snippet

*.suricate-profilemisc/.gitignoreไม่ได้อยู่ใน

PaletteMira.suricate-profile ไม่มีอยู่ในสาขานี้จากระยะไกล แต่มีอยู่ในพื้นที่

4.3 ปลายทาง

สาขาปลายทาง - SashaDevelop

ส่วนหนึ่งของ.gitignore:

*.sublime-snippet

*.suricate-profilemisc/.gitignoreไม่ได้อยู่ใน

PaletteMira.suricate-profileมีอยู่สำหรับสาขานี้จากระยะไกลและในประเทศ

4.4 ขั้นตอนในการทำซ้ำ

ฉันเปิดใช้พื้นที่เก็บข้อมูล PaletteMira GitHub สำหรับ Travis CI →ฉันตั้งค่าตัวแปรสภาพแวดล้อม $GITHUB_TOKENด้วยค่า -โทเค็น GitHubของฉัน →ฉันทำการกระทำใด ๆ กับสาขา src ของฉัน

หากไม่มีข้อผิดพลาดผมจะต้องได้รับพฤติกรรมที่คาดหวัง


0

คุณช่วยและผลักดันจาก Heroku ได้ไหม?

เช่นเพิ่มเสียงผลักพวกเขาไปที่ github และเป็น heroku ลบไฟล์ในสำเนาที่ทำงานบน Heroku ลบเสียงออกจาก repo แต่ไม่ได้ออกจากดิสก์จากนั้นกดการเปลี่ยนแปลงนั้นกลับไปที่ gitub


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