git ที่เก็บซิงค์ระหว่างคอมพิวเตอร์เมื่อย้ายไปมา?


89

สมมติว่าฉันมีพีซีเดสก์ท็อปและแล็ปท็อปบางครั้งฉันทำงานบนเดสก์ท็อปและบางครั้งฉันก็ทำงานบนแล็ปท็อป

วิธีที่ง่ายที่สุดในการย้ายที่เก็บ git ไปมาคืออะไร?

ฉันต้องการให้ที่เก็บ git เหมือนกันเพื่อที่ฉันจะได้ดำเนินการต่อจากที่ที่ฉันทิ้งไว้ในคอมพิวเตอร์เครื่องอื่น

ฉันต้องการตรวจสอบให้แน่ใจว่าฉันมีสาขาและแท็กเดียวกันบนคอมพิวเตอร์ทั้งสองเครื่อง

ขอบคุณ Johan

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

หมายเหตุ: คอมพิวเตอร์ทั้งสองเครื่องกำลังใช้งาน Linux


อัปเดต :

ลองใช้แนวคิด XANI: s กับ repo git เปล่าบนเซิร์ฟเวอร์และไวยากรณ์คำสั่ง push จาก KingCrunch ในตัวอย่างนี้มีไคลเอนต์สองตัวและหนึ่งเซิร์ฟเวอร์

มาสร้างส่วนของเซิร์ฟเวอร์ก่อน

ssh user@server
mkdir -p ~/git_test/workspace
cd ~/git_test/workspace
git --bare init

ดังนั้นจากคอมพิวเตอร์เครื่องอื่นฉันพยายามรับสำเนา repo ด้วยโคลน:

git clone user@server:~/git_test/workspace/
Initialized empty Git repository in /home/user/git_test/repo1/workspace/.git/
warning: You appear to have cloned an empty repository.

จากนั้นไปที่ repo นั้นและเพิ่มไฟล์:

cd workspace/
echo "test1" > testfile1.txt
git add testfile1.txt
git commit testfile1.txt -m "Added file testfile1.txt"
git push origin master

ตอนนี้เซิร์ฟเวอร์ได้รับการอัปเดตด้วย testfile1.txt

ลองดูว่าเราจะได้ไฟล์นี้จากคอมพิวเตอร์เครื่องอื่นหรือไม่

mkdir -p ~/git_test/repo2
cd ~/git_test/repo2
git clone user@server:~/git_test/workspace/
cd workspace/
git pull

ตอนนี้เราสามารถดูไฟล์ทดสอบได้

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

echo "test2" >> testfile1.txt
git add testfile1.txt
git commit -m "Test2"
git push origin master

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


ซิงค์สคริปต์เพื่อทำให้กระบวนการใช้ git เพื่อซิงค์จาก PC1 ไปยัง PC2 โดยอัตโนมัติได้อย่างรวดเร็วและมีการใช้ข้อมูลต่ำแม้ผ่านฮอตสปอต wifi ของโทรศัพท์มือถือ (เร็วกว่า rsync หลายร้อยเท่าสำหรับกรณีการใช้งานนี้!): stackoverflow.com/questions / 4948190 / …
Gabriel Staples

คำตอบ:


28

ฉันคิดว่ามีหลายวิธี ฉันจะอธิบายว่าฉันจัดการเรื่องนี้อย่างไร

ฉันมีเน็ตบุ๊กหนึ่งเครื่องเป็นเซิร์ฟเวอร์ตลอด 24 ชั่วโมงทุกวันซึ่งมีที่เก็บ git หลายแห่ง จาก / ไปที่นั่นฉันผลักและดึงการเปลี่ยนแปลงผ่าน SSH สำหรับการเข้าถึงจากภายนอกฉันใช้ dyndns.org มันใช้งานได้ดีโดยเฉพาะอย่างยิ่งเนื่องจากฉันมีมากกว่าสองระบบที่ต้องการเข้าถึงที่เก็บบางส่วน

อัปเดต: ตัวอย่างเล็กน้อย สมมติว่าเน็ตบุ๊กของฉันเรียกว่า "เน็ตบุ๊ก" ฉันสร้างที่เก็บที่นั่น

$ ssh username@netbook.local
$ cd ~/git
$ mkdir newThing
$ cd newThing
$ git init --bare

บนเดสก์ท็อปของฉันฉันจะสร้างโคลนของมันมากกว่า บางทีฉันอาจจะเพิ่มไฟล์บางไฟล์ด้วย

$ git clone username@netbook.local:/home/username/git/newThing
$ git add .
$ git commit -m "Initial"
$ git push origin master

ในพอร์ตของฉันฉันจะทำแบบเดียวกัน แต่สำหรับการเข้าถึงระยะไกล (จากภายนอก LAN ของฉัน) ฉันจะเพิ่มที่อยู่ภายนอกด้วย

$ git clone username@netbook.local:/home/username/git/newThing
$ git remote add externalName username@mydyndns.home-ip.org:/home/username/git/newThing
$ git pull externalName master

มันเป็นเพียงวิธีการทำงานของ git (/ git workflows) คุณสามารถเพิ่มที่เก็บระยะไกลได้มากเท่าที่คุณต้องการ มันไม่สำคัญหากสองหรือมากกว่าอ้างถึงที่เก็บ "ทางกายภาพ" เดียวกัน คุณไม่จำเป็นต้องมี "เซิร์ฟเวอร์" ในเครื่องของตัวเองคุณสามารถใช้เซิร์ฟเวอร์สาธารณะใดก็ได้ที่คุณมีสิทธิ์เข้าถึง ssh และแน่นอนว่าคุณไม่จำเป็นต้องมีเซิร์ฟเวอร์สาธารณะเลยหากคุณไม่ต้องการการเข้าถึงจากภายนอก ที่เก็บเปล่ายังสามารถอยู่บนระบบเดสก์ท็อปจากนั้นคุณสามารถสร้างที่เก็บสำเนาที่ใช้งานได้ภายในระบบไฟล์ภายใน

$ mkdir myRepo; cd myRepo
$ git init --bare
$ cd /path/to/myProject
$ git remote add origin /path/to/myRepo
$ git add .; git commit -m "Initial"; git push origin master

นี่คือวิธีที่ฉันจัดการกับสิ่งนี้และสำหรับฉันแล้วมันใช้ได้ดีทีเดียว (ถ้าไม่สมบูรณ์แบบ;))

สิ่งที่ต้องอ่าน: http://progit.org/ หนังสือ ดีจริงๆ -


จะเป็นอย่างไรเมื่อคุณใช้วิธีต่างๆใน repo คุณต้องการที่จะชี้แจงคำตอบของคุณด้วยตัวอย่างหรือไม่?
โยฮัน

ขอบคุณตัวอย่างเหล่านั้นให้ความกระจ่างมาก :)
โยฮัน

6

ฉันจะโคลน repo จากกล่องหนึ่งไปยังอีกกล่องหนึ่งจากนั้นตั้งค่า repos สองรายการเพื่อที่ฉันจะได้git fetchจากอีกกล่องหนึ่ง

การเปลี่ยนชื่อรีโมตจากoriginเป็นชื่อของกล่องอื่นทำให้สาขาระยะไกลอ่านง่ายขึ้น

โปรดทราบว่าเพียงแค่ใช้git fetch(และไม่ใช่git push) สิ่งนี้ใช้ได้ดีกับที่เก็บที่ไม่ใช่เปลือย:

[user@foo repo]$ git fetch -v bar

[user@bar repo]$ git fetch -v foo

5

วิธีที่ง่ายที่สุด: repo กลางที่สร้างขึ้นด้วย--bare(ดังนั้นจึงไม่มีไฟล์ที่เช็คเอาต์มีเฉพาะ. git) หรือ github

"กระจาย" จะมีลักษณะดังนี้:

ติดตั้ง:

  1. บนแล็ปท็อป: git remote add desktop ssh://user@desktop/home/user/repo/path
  2. บนเดสก์ท็อป: git remote add laptop ssh://user@laptop/home/user/repo/path

กำลังซิงค์:

git pull laptop/desktop (การกดใช้งานได้ไม่ดีกับ repos ที่ไม่เปลือยเปล่าเนื่องจาก git จะไม่แก้ไขไฟล์ที่เช็คเอาต์เมื่อกดไปที่ repo ระยะไกล)

หรือทำ repo บน pendrive;)


ฉันพยายามใช้ a --bare repo แต่ฉันไม่สามารถรับเวิร์กโฟลว์ทั้งหมดได้อย่างถูกต้อง
โยฮัน

ฉันเพิ่งเริ่มต้นด้วยคอมไพล์และเปลี่ยนจากคอมไพล์ในเครื่องไปยัง github และย้อนกลับไปตอนนี้ฉันทำได้ แต่วิธีคอมพิวเตอร์กับคอมพิวเตอร์ฉันไม่สามารถใช้งานได้ คำถามโง่ - ฉันใช้หนังสือรับรองuserอะไร สำหรับ github ฉันต้องเพิ่มคีย์ rsa-pub ฉันพยายามเพิ่ม rsa-pub สำหรับคอมพิวเตอร์ผู้ขอโคลนไปยัง known_hosts แต่นั่นไม่ได้ทำตามเคล็ดลับ ...
Dave

นี่เป็นวิธีที่ง่ายที่สุดสำหรับฉันในการซิงค์ระหว่างเครื่องสองเครื่องโดยไม่ต้องกดปุ่มเซิร์ฟเวอร์ระยะไกลอย่างต่อเนื่อง
johnzachary

1

ใช้งานง่ายแค่rsyncไหน?


3
ฉันใช้ rsync มาหลายปีแล้วเพื่อให้เซิร์ฟเวอร์สามเครื่องซิงค์กัน ใช้งานได้ แต่ rsync ไม่ได้ให้วิธีย้อนกลับการเปลี่ยนแปลงเมื่อซิงค์เสร็จสิ้น ฉันสูญเสียไฟล์จำนวนมากด้วยวิธีนี้เนื่องจากฉันไม่ได้อ่านเอาต์พุตแบบ dry-run ใกล้พอและ rsync ถูกตั้งค่าให้ลบไฟล์ที่ไม่มีอยู่ในต้นแบบ ตั้งแต่นั้นมาฉันได้เปลี่ยนไปใช้คอมไพล์และพบว่าเป็นวิธีที่ปลอดภัยกว่ามากในการซิงค์ไดเร็กทอรีที่สำคัญ
Cloudkiller

1

คุณไม่สามารถสร้างที่เก็บระยะไกลบน GitHub, BitBucket หรือ GitLab ได้หรือไม่? (สอง บริษัท หลังเสนอที่เก็บส่วนตัวฟรีไม่ จำกัด ) เมื่อคุณเสร็จสิ้นวันที่ทำงานเพียงใช้git pushเพื่อพุชการเปลี่ยนแปลงของคุณไปยัง repo ระยะไกล เมื่อคุณกลับถึงบ้านเพียงแค่git pullดึงการเปลี่ยนแปลงจากที่ทำงานลงในเครื่องที่บ้าน ในทำนองเดียวกันเมื่อคุณเสร็จสิ้นที่บ้านทำแล้วเมื่อคุณกลับไปทำงานทำ git pushgit pull


ปัญหาในการทำเช่นนี้คือมันบังคับให้คุณทำการคอมมิต (ซึ่งจะเข้าสู่ประวัติการคอมมิต) ในงานที่ไม่สมบูรณ์เพียงเพื่อให้คุณสามารถโอนรหัสของคุณไปยังเครื่องอื่นได้ ฉันกำลังมองหาวิธีทำบางอย่างที่ง่ายเหมือนที่คุณพูดถึง แต่อย่าสร้างการกระทำในถังขยะและหลีกเลี่ยงการใช้-fตัวเลือกที่เป็นอันตรายgit pushในการเขียนทับการกระทำ "โอน" ในถังขยะ
Pulseczar

1

วิธีที่ง่ายที่สุดในการย้ายที่เก็บ git ไปมา [ระหว่างคอมพิวเตอร์ 2 เครื่อง] คืออะไร

สถานการณ์ที่ 1: ฉันทำงาน (แก้ไขโค้ดและไฟล์) เฉพาะบน PC1 แต่ต้องการมีสำเนาไฟล์ที่ซ้ำกัน (เช่นเพื่อสร้างฐานรหัสทั้งหมด) บน PC2 ด้วย

ซิงค์จาก PC1 ไปยัง PC2 ใน <1 นาทีผ่านฮอตสปอต wifi ในขณะที่ใช้ข้อมูล <25 MB:

ฉันทำงานกับคอมพิวเตอร์ที่อ่อนแอเครื่องหนึ่งที่เดินทางด้วย (แล็ปท็อป) แต่สร้างจากคอมพิวเตอร์ที่มีประสิทธิภาพมากกว่าซึ่งตั้งอยู่ที่อื่น ฉันใช้คอมไพล์ตลอดเวลาเพื่อซิงค์จากแล็ปท็อปไปยังคอมพิวเตอร์เครื่องอื่นโดยใช้สคริปต์ ฉันแค่พิมพ์คำสั่งนี้เพื่อเรียกใช้:

sync_git_repo_from_pc1_to_pc2

แค่นั้นแหละ! มันมักจะใช้เวลาประมาณ 25 MB ของข้อมูลและ ~ 30 วินาทีถึง 1 นาทีแม้ในขณะที่ใช้โทรศัพท์มือถือฮอตสปอต Wi-Fi และการทำงานใน repo ที่เป็นหลายสิบกิกะไบต์ในขนาด ฉันเข้าสู่ PC2 ดังนั้นฉันจึงทำgit log -1บน PC2 เพื่อตรวจสอบว่าการซิงค์ทำงานได้จากนั้นฉันจึงเรียกใช้คำสั่ง build ทำงานได้อย่างสมบูรณ์ ให้มันยิง ดูลิงค์ด้านล่างสำหรับรายละเอียด

หมายเหตุ: repo โคลนบน PC2 somename_SYNCจะอยู่ในสาขาคอมไพล์ชื่อ แก้ไขสคริปต์ให้เหมาะสมหากคุณต้องการให้มีชื่อสาขาเดียวกันแทนที่จะใช้ "สาขา SYNC" เสมอ เป็นไปได้ที่จะแก้ไขสคริปต์เพื่อให้ได้เอฟเฟกต์เช่นสถานการณ์ที่ 2 ด้านล่างหากต้องการ อย่างไรก็ตามการทำ Scenario 2 ด้วยตนเองไม่ใช่เรื่องยากดังนั้นคุณอาจต้องการทำ Scenario 2 ด้วยตนเองต่อไป เป็นสถานการณ์ที่ 1 ที่สคริปต์อัตโนมัติเป็นประโยชน์และประหยัดเวลามากที่สุดเนื่องจากช่วยให้"แก้ไขซิงค์สร้าง" เวิร์กโฟลว์ "แก้ไข" ที่ "แก้ไข" เกิดขึ้นบน PC1 ได้ง่ายและรวดเร็ว"ซิงค์" จะทำงานจาก PC1 แต่ยังส่งผลต่อ PC2 และ "build" เกิดขึ้นบน PC2

ลิงค์:

  1. คำแนะนำในการตั้งค่าและการติดตั้งทั้งหมดที่นี่:
    ทำงานกับโปรเจ็กต์ระยะไกลด้วย Eclipse ผ่าน SSH
  2. Readme เอกสารและ repo ที่นี่: https://github.com/ElectricRCAircraftGuy/eRCaGuy_dotfiles/blob/master/useful_scripts/README_git-sync_repo_from_pc1_to_pc2.md
  3. สคริปต์ที่เป็นปัญหาอยู่ที่นี่:
    https://github.com/ElectricRCAircraftGuy/eRCaGuy_dotfiles/blob/master/useful_scripts/sync_git_repo_from_pc1_to_pc2.sh

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

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

  1. ไปที่https://github.comและสร้างบัญชีและเลือก (แนะนำ) ตั้งค่าปุ่ม SSH

  2. ตอนนี้ใช้อินเทอร์เฟซเว็บเพื่อสร้างที่เก็บใหม่

    1. ตั้งแต่ปี 2020 หรือก่อนหน้านั้น GitHub อนุญาตให้ใช้ที่เก็บส่วนตัวฟรีได้เช่นกันดังนั้นจึงใช้งานได้ดีแม้กับโปรเจ็กต์ส่วนตัวแบบปิด
  3. ค้นหา URL ที่เก็บใหม่ ssh หรือ https โคลน Ex: git@github.com: ElectricRCAircraftGuy / eRCaGuy_dotfiles.git หรือhttps://github.com/ElectricRCAircraftGuy/eRCaGuy_dotfiles.git

  4. โคลนโครงการไปยัง PC1 เช่น:

     git@github.com:ElectricRCAircraftGuy/eRCaGuy_dotfiles.git
     cd eRCaGuy_dotfiles
    
  5. และทำซ้ำคำสั่งโคลนเดียวกันทุกประการบน PC2

  6. ตอนนี้บน PC1 ทำการเปลี่ยนแปลงบางอย่างยืนยันและส่งไปยังที่เก็บ "ระยะไกล" บน github

     # edit some files, then do the following
     git add -A  # stage ("add") all changed files to be committed 
     git commit  # commit them
     git push    # push them to your remote github repo
    
  7. ตอนนี้บน PC2 ดึงการเปลี่ยนแปลงของคุณ:

     # pull all changes from github (which includes the changes
     # you just pushed from PC1) to PC2
     git pull  
    
  8. ตอนนี้คุณสามารถแก้ไขไฟล์บน PC2 คอมมิตและส่งไปยัง github โดยใช้คำสั่งที่แสดงเพียง 2 ขั้นตอนด้านบนจากนั้นจาก PC1 คุณสามารถเรียกใช้git pullเพื่อดึงการเปลี่ยนแปลงเหล่านั้นจาก PC2 ได้

  9. ทำตามขั้นตอนนี้ต่อไปตามต้องการทำงานบน PC1 หรือ PC2 และแชร์ไฟล์และแยกงานระหว่างคอมพิวเตอร์ทั้งสองเครื่องได้อย่างง่ายดาย เพียงจำไว้ว่าการเปลี่ยนแปลงทั้งหมดของคุณต้องได้รับการยอมรับและผลักดันไปที่ githubบนพีซีเครื่องหนึ่งก่อนที่คุณจะสามารถตรวจสอบได้ (ดึงออก) และทำงานบนพีซีเครื่องอื่นต่อไป

  10. หากคุณเคยตกอยู่ในสถานการณ์ที่ไฟล์ไม่ซิงค์กันเล็กน้อยระหว่างพีซีทั้งสองเครื่องคุณอาจต้องใช้สาขาพิเศษบางส่วนทำการรวมแก้ไขข้อขัดแย้ง ฯลฯ จากนั้นมันจะคล้ายกับการทำงานมากขึ้น ด้วยทีมงานเล็ก ๆ ที่คุณทุกคนทำงานใน repo เดียวกัน Google คือเพื่อนของคุณ Git มีประสิทธิภาพมากและมีคำสั่งชุดคำสั่งหรือเวิร์กโฟลว์สำหรับทุกอย่าง


0

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


0

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

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