สองที่เก็บ git ในไดเร็กทอรีเดียว?


89

เป็นไปได้ไหมที่จะมีที่เก็บ 2 git ในไดเร็กทอรีเดียว ฉันไม่คิด แต่คิดว่าฉันจะถาม โดยทั่วไปฉันต้องการตรวจสอบไฟล์กำหนดค่าโฮมไดเร็กทอรีของฉัน (เช่น. emacs) ซึ่งควรเป็นเรื่องปกติในทุกเครื่องที่ฉันใช้งาน แต่มีที่เก็บที่สองสำหรับไฟล์ในเครื่อง (เช่น. emacs.local) ซึ่งมี การกำหนดค่าเฉพาะเครื่อง วิธีเดียวที่ฉันคิดจะทำก็คือการกำหนดค่าโลคัลในไดเร็กทอรีย่อยและละเว้นไดเร็กทอรีย่อยนั้นจากที่เก็บ git หลัก ความคิดอื่น ๆ ?


git subtreeจะได้งานทำ
Syd Pao

หากคุณไม่ได้จัดการกับไฟล์มากเกินไปคุณสามารถสร้างลิงก์ / ทางแยกได้เช่นกัน
thdoan

คำตอบ:


38

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

เริ่มต้น repo และคอมมิตไฟล์ทั่วไปให้กับมันโดยอาจเปลี่ยนชื่อสาขา MASTER เป็น Common จากนั้นสร้างสาขาแยกจากที่นั่นสำหรับแต่ละเครื่องที่คุณทำงานด้วยและคอมมิตไฟล์เฉพาะเครื่องลงในสาขานั้น ทุกครั้งที่คุณเปลี่ยนไฟล์ทั่วไปให้รวมสาขาทั่วไปเข้ากับแต่ละสาขาของเครื่องและส่งไปยังเครื่องอื่นของคุณ (เขียนสคริปต์สำหรับสิ่งนั้นหากมีจำนวนมาก)

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


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

ใช้ Mercurial และ Git ทั้งคู่
Linc

177

บทความนี้ครอบคลุมเนื้อหานี้ค่อนข้างดี:

https://github.com/rrrene/gitscm-next/blob/master/app/views/blog/progit/2010-04-11-environment.markdown

โดยทั่วไปหากคุณกำลังทำงานจากบรรทัดคำสั่งสิ่งนี้จะง่ายกว่าที่คุณคาดเดา สมมติว่าคุณต้องการ 2 git repos:

.gitone
.gittwo

คุณสามารถตั้งค่าได้ดังนี้:

git init .
mv .git .gitone
git init .
mv .git .gittwo

คุณสามารถเพิ่มไฟล์และคอมมิตเป็นไฟล์เดียวได้ดังนี้:

git --git-dir=.gitone add test.txt
git --git-dir=.gitone commit -m "Test"

ดังนั้นตัวเลือกสำหรับ git จึงมาก่อนคำสั่งจากนั้นจึงเลือกตัวเลือกของคำสั่ง git คุณสามารถใช้นามแฝงคำสั่ง git ได้มากพอเช่น:

#!/bin/sh
alias gitone='git --git-dir=.gitone'
alias gittwo='git --git-dir=.gittwo'

ดังนั้นคุณสามารถยอมรับอย่างใดอย่างหนึ่งด้วยการพิมพ์น้อยลงเล็กน้อยเช่น gitone commit -m "blah"ที่มีน้อยน้อยกว่าการพิมพ์เช่น

สิ่งที่ดูเหมือนจะยุ่งยากกว่าคือละเว้น เนื่องจากโดยปกติ. gitignore จะอยู่ในรูทของโปรเจ็กต์คุณจึงต้องหาวิธีเปลี่ยนสิ่งนี้ด้วยโดยไม่ต้องเปลี่ยนรูททั้งหมด หรือคุณสามารถใช้. git / info / exclude แต่การเพิกเฉยทั้งหมดที่คุณทำจะไม่ถูกผูกมัดหรือผลักดันซึ่งอาจทำให้ผู้ใช้รายอื่นเสียหายได้ ผู้อื่นที่ใช้ repo อย่างใดอย่างหนึ่งอาจผลักดัน. gitignore ซึ่งอาจทำให้เกิดความขัดแย้ง ยังไม่ชัดเจนสำหรับฉันวิธีที่ดีที่สุดในการแก้ไขปัญหาเหล่านี้

หากคุณชอบเครื่องมือ GUI เช่น TortoiseGit คุณก็มีความท้าทายเช่นกัน คุณสามารถเขียนสคริปต์ขนาดเล็กที่เปลี่ยนชื่อ. gitone หรือ. gittwo เป็น. git ชั่วคราวเพื่อให้เป็นไปตามสมมติฐานของเครื่องมือเหล่านี้


1
การตั้งค่าเป็นนามแฝงทำให้เกิดข้อผิดพลาดนี้: $ git config --global alias.pub '--git-dir = ~ / Server / www / .gitpublic' $ git pub add ร้ายแรง: นามแฝง 'pub' เปลี่ยนตัวแปรสภาพแวดล้อมคุณสามารถใช้ '! git' ในนามแฝงเพื่อทำสิ่งนี้ คุณจะตั้งค่า "! git" ไว้ที่ใดในกรณีนี้
JaredBroad

1
@JaredBroad น่าสนใจ - ฉันแนะนำให้คุณใช้นามแฝง Bash ไม่ใช่นามแฝงของคอมไพล์ Likealias gitone='git --git-dir=.gitone'
Chris Moschini

10
คุณสามารถกำหนดค่า Repos ใช้ไฟล์ของตัวเองยกเว้นและคุณสามารถติดตามเหล่านั้นคือและgitone config core.excludesfile gitone.exclude gitone add gitone.excludeฉันสร้างสคริปต์ที่ขยายในโซลูชันนี้: github.com/capr/multigit

2
@JaredBroad ฉันทำแบบนี้git config --global alias.youralias '!git --git-dir="/d/MyProject/_git"'แล้วgit youralias status:)
starikovs

1
หากคุณตั้งสมมติฐานว่า.gitignoreไฟล์มักจะถูกตั้งค่าและลืมคุณสามารถสร้างสำเนาที่แตกต่างกันสำหรับแต่ละ repo จากนั้นคัดลอกเวอร์ชันที่เกี่ยวข้องไปยังไดเร็กทอรีโดยเป็นส่วนหนึ่งของนามแฝง นี้ใช้กับไฟล์อื่น ๆ ในรากที่อาจมีความขัดแย้งเช่นและREADME.md .gitattributes
thdoan

15

มีลักษณะที่submodule คอมไพล์

โมดูลย่อยอนุญาตให้ฝังที่เก็บภายนอกภายในไดเร็กทอรีย่อยเฉพาะของแผนผังต้นทางโดยชี้ไปที่คอมมิตเฉพาะเสมอ


8
ไม่ดีสำหรับไฟล์ที่ต้องอยู่ในรูทของไดเร็กทอรีของคุณ โอกาสเดียวที่จะเติมรากของ symlinks เหล่านี้
WhyNotHugo

6

RichiH เขียนเครื่องมือที่เรียกว่าvcshซึ่งเป็นเครื่องมือในการจัดการ dotfiles โดยใช้ repos เปล่าของ git เพื่อใส่ไดเรกทอรีการทำงานมากกว่าหนึ่งรายการใน $ HOME ไม่เกี่ยวอะไรกับ csh AFAIK

อย่างไรก็ตามหากคุณมีหลายไดเร็กทอรีทางเลือกสำหรับ git-submodules (ซึ่งเป็นความเจ็บปวดในสถานการณ์ที่ดีที่สุดและการใช้ตัวอย่างนี้ไม่ใช่สถานการณ์ที่ดีที่สุด) คือgitslaveซึ่งปล่อยให้ repos ทาสตรวจสอบที่ปลาย a สาขาตลอดเวลาและไม่จำเป็นต้องใช้กระบวนการสามขั้นตอนเพื่อทำการเปลี่ยนแปลงใน repo บริษัท ย่อย (ชำระเงินไปยังสาขาที่ถูกต้องทำการเปลี่ยนแปลงและดำเนินการเปลี่ยนแปลงจากนั้นไปที่ superproject และทำการคอมมิตโมดูลย่อยใหม่)


6

เป็นไปได้โดยใช้ตัวแปรGIT_DIRแต่มีข้อแม้มากมายหากคุณไม่รู้ว่ากำลังทำอะไรอยู่


4

ใช่โมดูลย่อยน่าจะเป็นสิ่งที่คุณต้องการ อีกทางเลือกหนึ่งคือการมีสำเนาการทำงานของคุณในไดเร็กทอรีย่อยจากนั้นชี้ลิงก์สัญลักษณ์จากโฮมไดเร็กทอรีไปยังไฟล์ที่สนใจ


3

วิธีที่ฉันต้องการคือใช้ repo ใน subdir และใช้ลิงก์สัญลักษณ์แบบเรียกซ้ำ:

git clone repo1
cd somerepo
git clone repo2
cd repo2
./build

โดยที่ไฟล์ ' repo / build ' มีลักษณะดังนี้:

#!/bin/bash 
SELF_PATH="$(dirname "$(readlink -f "$0")" )"  # get current dir 
cd .. && git stash && git clean -f -d ''       # remove previous symlinks
cp -sR "$SELF_PATH"/* ../.                     # create recursive symlinks in root

ข้อควรระวัง : อย่าใช้ 'git add'


0

อีกทางเลือกหนึ่งคือใช้ในโฟลเดอร์ที่แยกจากกันและสร้างฮาร์ดลิงก์สัญลักษณ์จากโฟลเดอร์หนึ่งไปยังอีกโฟลเดอร์หนึ่ง

ตัวอย่างเช่นหากมีที่เก็บ:

  1. Repo1 / โฟลเดอร์
  2. Repo1 / โฟลเดอร์ B

และ:

  1. Repo2 / โฟลเดอร์

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

User@Repo1$ mklink /J FullPath/Repo2/FolderA FullPath/Repo1/FolderA
User@Repo1$ mklink /J FullPath/Repo2/FolderB FullPath/Repo1/FolderB
User@Repo1$ printf "/FolderA/*\n/FolderB/*\n" >> .gitignore

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


0

คำเตือน: นี่ไม่ใช่การโฆษณา ฉันเป็นผู้พัฒนาไลบรารีที่มีให้

ฉันได้สร้างส่วนขยาย git เพื่อจัดการกรณีที่คุณต้องการรวมหลายที่เก็บไว้ในโฟลเดอร์เดียว ข้อดีของ lib คือการติดตามที่เก็บและความขัดแย้งของไฟล์ คุณสามารถค้นหาได้ในGitHub นอกจากนี้ยังมีที่เก็บตัวอย่าง 2 รายการให้ทดลองใช้

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