سؤال استخدام Git عبر أنظمة متعددة بدون الوصول إلى الشبكة


أرغب في استخدام التحكم في الإصدار ولكن ، لأسباب أمنية ، لا يعمل الخادم الذي أعمل عليه على الإنترنت: يمكنني نقل الملفات على محرك أقراص USB محمول فقط. هل ما زال بإمكاني استخدام Git باستخدام هذا الإعداد؟ هل يمكنني إنشاء تصحيحات صغيرة يمكنني تطبيقها على مستودع Git؟


83
2017-10-17 11:39


الأصل


يقول العنوان الخاص بك لا الوصول إلى الشبكة ، سؤالك يقول لا الإنترنت ؛ فرق كبير. - tkausl
TutuKaeen يمكنك الحصول على شبكة محلية غير متصلة بالإنترنت. لذا بدلا من github.com قمت بإعداد خادم بوابة على سبيل المثال. 192.168.1.100 وكل شيء آخر يعمل نفسه. - Agent_L
TutuKaeen: السؤال المهم هو ما إذا كان الاتصال الشبكي المباشر (أو غير المباشر) ممكنًا بين الجهازين. إذاً ، في حالتنا ، يتم توصيل كلتا الشبكتين ، لكن يتم فصل الشبكات؟ في هذه الحالة ، يرجى تعديل هذه المعلومات في سؤالك. - sleske
TutuKaeen يبقى السؤال غير واضح. أنت تقول أنك تريد استخدام التحكم في الإصدار ، ولكن في تعليقاتك ، فإنك تحتاج إلى مساعدتك على النشر في الإنتاج. هذه القضايا لا تتداخل دائمًا. أعتقد أن لديك إجابات جيدة أدناه الآن ، ولكن في المستقبل سيكون من المفيد إذا كان سؤالك أكثر شمولاً حول متطلباتك ، والتي يبدو أنها: "أريد استخدام التحكم في الإصدار ، جهاز التطوير الخاص بي لا يمتلك الوصول إلى الإنترنت ، لديها الوصول إلى الشبكة ولكن ليس إلى آلة الإنتاج ، وأريد أن أعرف كيفية الحصول على التعليمات البرمجية من التحكم في الإصدار إلى جهاز الإنتاج. " - DavidS
يبدو من الغريب استخدام هذا المصطلح server لجهاز غير متصل بأي شبكة. يمكن أن يكون مجرد شبكة محلية حتى من دون الوصول إلى الإنترنت ولكنها لا تزال شبكة مع ذلك. - uom-pgregorio


الأجوبة:


بالتأكيد ، لا يوجد شيء حول Git يتطلب بروتوكولًا معينًا. فقط من خارج منطقة الجزاء العميل القياسي يدعم HTTP (S) ، SSH ، بروتوكول Git المخصص ، والأهم من ذلك ، محلي بروتوكول. هذا فقط يأخذ الطريق إلى المحلية .git الدليل ، والتي يمكن أن تكون ضمن دليل العمل (/path/to/project/.git) أو مجرد دليل العارية (/path/to/project.git) ، على الرغم من أن التسمية هي مجرد اتفاقية.

هذا يعني أنه يمكنك بالطبع إضافة محرك أقراص فلاش كجهاز تحكم عن بعد:

git remote add origin /mnt/flashdrive/foo.git

أو على نظام التشغيل Windows:

git remote add origin F:\foo.git

أو حتى إضافته كوحدة تحكم إضافية باسم مختلف (إذا كنت تفضل ذلك origin للإشارة إلى خادم إنترنت في مكان ما):

git remote add flashdrive /mnt/flashdrive/foo.git

ثم يمكنك فقط دفع / سحب إلى / من هذا بعيد مثل أي شيء آخر.

إذا كنت تقرأ كابل بيانات، ستلاحظ هناك أيضا file:// البروتوكول الذي يتصرف بشكل مختلف قليلا. من المستحسن استخدام مسار محلي حيث سيستخدم بعض التحسينات الإضافية - إذا كنت تستخدم file:// بروتوكول ثم ستستخدم بوابة بعض مكونات الشبكة القياسية (للتحدث إلى القرص المحلي) ، وهو أبطأ.


155
2017-10-17 12:24



للإضافة إلى هذه الإجابة الاستثنائية - قد يكون من المفيد أيضًا إجراء تحقيقات باستخدام جهاز "فارغ" على محرك الأقراص المحمول. لا تحتوي مستودعات "عارية" على شجرة عاملة ، وبالتالي تقطع فئة من المشكلات المحتملة عند استخدامها كنقطة سلطة مشتركة ، والتي تبدو مثل حالة الاستخدام في OP. - Iron Gremlin
ال file:// هو أيضا أكثر مرونة قليلا. يتيح لك استخدام بعض الميزات (مثل النسخ المستنسخة الضحلة) التي لا يمكنك استخدامها مع المسار المحلي. - Austin Hemmelgarn
IronGremlin هل يمكنك التوسع في مفهوم "نقطة السلطة المشتركة"؟ أنا لست خبيراً في Git وأنا أشعر بالفضول حيال ما تعنيه به. - Lightness Races in Orbit
LightnessRacesinOrbit - إنه موضوع كثيف جدًا ، ولكن ، في الأساس ، يتم توزيع بوابة ، بحيث يحصل الجميع على تاريخهم الخاص. يمكن أن يسأل B عن نسختهم من التاريخ ، لكن C لا يعرف عنها إلا إذا أخبرهم شخص ما. إن وجود مستودع واحد لتخزين التاريخ "الرسمي" يعني أن D تعمل بمثابة مركز لتبادل المعلومات للتاريخ. لذلك ، يقول A عن D حول التغييرات ، ويعرف B و C التحدث إلى D للبقاء على اطلاع على آخر المستجدات ، بدلاً من القيام بأشياء جانبية على القناة فيما بينها. مثال على ذلك ، إذا كان خادم OP هو C ، وكان محرك الأقراص المحمول هو D ، فإنه يتأكد من عدم استبعاد الخادم من تفاعلات A / B. - Iron Gremlin
LightnessRacesinOrbit من المهم أن نلاحظ هنا أن العارية لا يعني بالضرورة أن تكون موثوقة ، إنها مفيدة فقط في هذا السياق. على سبيل المثال ، من المفيد أيضًا نظرًا لأنه ، نظرًا لعدم وجود شجرة عاملة ، يكون حجمها أصغر (أو عرض النطاق الترددي). كان هذا جحيمًا أكثر أهمية بكثير مما هو عليه الآن ، ولكن لا يزال يظهر. - Iron Gremlin


على غير مرتبطة الكمبيوتر ، لا شيء خاص مطلوب. يركض git init في الدليل المطلوب والعمل مع Git كما تفعل عادة.

لمزامنة مستودع عبر مضاعف أجهزة الكمبيوتر ، هناك عدة طرق.

الطريقة 1 أ (لا توجد شبكة على الإطلاق): يمكنك إنشاء "مستودع تخزين" على عصا USB ، ثم الضغط عليه وسحب منه كما تفعل مع أي مستودع بعيد آخر. بمعنى آخر ، لا تختلف عمليات مستودع التخزين عبر المسارات المحلية عن العمليات عبر عناوين URL SSH أو HTTPS.

  1. إنشاء مستودع "بعيد":

    $ git init --bare /mnt/Stick/Repositories/Large_Project.git
    
  2. في الكمبيوتر 1 ، دفع كل شيء إليه:

    $ cd ~/Large_Project
    $ git remote add usb /mnt/Stick/Repositories/Large_Project.git
    $ git push usb master
    
  3. في الكمبيوتر 2 ، حسنا ، كما هو الحال دائما.

    $ git remote add usb /mnt/Stick/Repositories/Large_Project.git
    $ git pull usb
    

(يمكنك الدفع / الجلب / السحب من عنوان URL أو المسار مباشرةً أيضًا).

الطريقة 1 ب (الشبكة الداخلية): إذا كان لديك خادم داخلي مزود بـ SSH ، وإذا كان مثبتًا على Git ، فيمكنك القيام بذلك نفس أعلاه، فقط حدد عنوان SSH باستخدام [user@]host:path أو ssh://[user@]host/path بناء الجملة.

  1. إنشاء مستودع "بعيد" عن طريق التشغيل git init --bare <somepath.git> على الخادم المعين (عبر SSH).

  2. في الكمبيوتر 1 ، بنفس الطريقة كما هو موضح في وقت سابق.

    $ git remote add origin myserver.example.com:Gits/Large_Project.git
    

    أو إذا كنت تفضل:

    $ git remote add origin ssh://myserver.example.com/Gits/Large_Project.git
    
  3. في الكمبيوتر 2 ، مرة أخرى نفس الطريقة 1 أ.


الطريقة الثانية: يمكنك إنشاء "حزم نقل" التي تقوم بأرشفة قائمة معينة بالالتزامات في ملف واحد.

للأسف ، لا تتذكر أوامر الحزمة تلقائيًا ما تم تجميعه في المرة الأخيرة ، لذلك يلزم وضع العلامات يدويًا أو حفظ الملاحظات. سوف آخذ الأمثلة من دليل git-bundle.

  1. في الكمبيوتر 1 ، قم بإنشاء حزمة من الفرع بالكامل:

    $ cd ~/Large_Project
    $ git bundle create /mnt/Stick/Project.bundle master
    $ git tag -f last-bundled master
    
  2. في الكمبيوتر 2 ، اسحب من الحزمة كما لو كانت مستودعًا:

    $ cd ~/Large_Project
    $ git pull /mnt/Stick/Project.bundle
    

لا تحتاج الحزم اللاحقة إلى حزم الكل master - يمكنهم حزم فقط الإلتزامات المضافة حديثًا من last-bundled..master في حين أن.

  1. في الكمبيوتر 1 ، قم بإنشاء حزمة من الإلتزامات المضافة حديثًا:

    $ cd ~/Large_Project
    $ git bundle create /mnt/Stick/Project.bundle last-bundled..master
    $ git tag -f last-bundled master
    
  2. نفس ما سبق.


46
2017-10-17 12:21



في الواقع ، لن يكون ذلك سيئًا لأهدافي ، وأيضًا في git لا شيء "أساسي" لأن كل مستودع لديه تاريخ كامل ، لذا يمكنك إعادة إنشائه في كل مرة يسوء فيها شيء ما - Tutu Kaeen
manual tagging or note-keeping is needed، خيار واحد ما لم يكن الريبو كبير جدا هو: git bundle create my.bundle --all، يجب أن تحتوي على كل شيء - birdspider
أنا أحب هذه الإجابة أكثر لأنها أكثر وضوحا على الرغم من أن الإجابة المقبولة وهذا ما يقول نفس الشيء. - Rystraum
ما هي أهمية خيار "العارية"؟ - Lightness Races in Orbit
يخلق مستودع هو مجرد قاعدة البيانات (ما تجد عادة في .git/ مجلد مخفي) ، دون "شجرة العمل" (الملفات القابلة للتحرير). هذا هو الشكل المفضل للمستودعات التي أنت git pushإلى. - grawity


git bundle create

إحدى الطرق هي استخدام التخزين الخارجي لتبادل البيانات بين المستودعات حزمة git. وبهذه الطريقة لديك فقط ملفات مفردة لكل عملية نقل ، وليس مستودعات Git المتوسطة.

كل "git push" يتحول إلى إنشاء ملف "git fetch" لجلب أشياء من هذا الملف.

جلسة تجريبية

إنشاء أول مستودع والقيام "بالدفع" الأول

gitbundletest$ mkdir repo1

gitbundletest$ cd repo1

repo1$ git init
Initialized empty Git repository in /tmp/gitbundletest/repo1/.git/
repo1$ echo 1 > 1 && git add 1 && git commit -m 1
[master (root-commit) c8b9ff9] 1
 1 file changed, 1 insertion(+)
 create mode 100644 1

repo1$ git bundle create /tmp/1.bundle master HEAD
Enumerating objects: 3, done.
Counting objects: 100% (3/3), done.
Writing objects: 100% (3/3), 384 bytes | 384.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)

"الاستنساخ" للمستودع الثاني (أي الكمبيوتر الثاني):

gitbundletest$ git clone /tmp/1.bundle repo2
Cloning into 'repo2'...
Receiving objects: 100% (3/3), done.

gitbundletest$ cd repo2/

repo2$ cat 1
1

إجراء بعض التغييرات و "دفعها" إلى ملف حزمة آخر:

repo2$ echo 2 > 1 && git add 1 && git commit -m 2
[master 250d387] 2
 1 file changed, 1 insertion(+), 1 deletion(-)

repo2$ git bundle create /tmp/2.bundle origin/master..master origin/HEAD..HEAD
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Writing objects: 100% (3/3), 415 bytes | 415.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)

"سحب" التغييرات إلى المستودع الأول:

repo2$ cd ../repo1

repo1$ git pull /tmp/2.bundle 
Receiving objects: 100% (3/3), done.
From /tmp/2.bundle
 * branch            HEAD       -> FETCH_HEAD
Updating c8b9ff9..250d387
Fast-forward
 1 | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

repo1$ cat 1
2

على عكس المجموعة الأولى ، يحتوي الثاني على سجل Git جزئي فقط ولا يمكن استنساخه بشكل مباشر:

repo1$ cd ..

gitbundletest$ git clone /tmp/2.bundle repo3
Cloning into 'repo3'...
error: Repository lacks these prerequisite commits:
error: c8b9ff94942039469fa1937f6d38d85e0e39893a 
fatal: bad object 250d38747656401e15eca289a27024c61e63ed68
fatal: remote did not send all necessary objects

هناك عيوب في استخدام الحزم التي تحتاج إليها لتحديد نطاق الإلتزامات الذي يجب أن تحتوي عليه كل حزمة يدويًا. مختلف git push، git bundle لا يتتبع ما كان في الحزمة السابقة ، تحتاج إلى ضبط يدوياً refs/remotes/origin/master أو الحزم ستكون أكبر مما يمكن أن تكون.


21
2017-10-17 15:33



لا تنس أن تذكر --all العلم للحصول على كل شيء. إذا كان الريبو صغيرًا بما فيه الكفاية ، فهذه هي أبسط عملية حيث تقوم ببساطة بنقل كل شيء في كل مرة! فقط لا تفك العصا الذاكرة - ربما أكبر مشكلة أمنية! - Philip Oakley


تحتاج إلى تثبيت لأول مرة بوابة. ثم لإنشاء مستودع تخزين جديد ، قم بتشغيل داخل المجلد الذي قمت بنسخه:

git init

ثم يمكنك إضافة الملفات التي تريد التحكم في الإصدار من خلال git add (إضافة -a لجميع الملفات) والبدء في ارتكاب التغييرات (git commit).

لا يتعين عليك الدفع إلى أي جهاز تحكم عن بُعد ، حيث يمكنك العمل على السجل المحلي (git log).

لمزيد من المعلومات ، تحقق من:


دفع / سحب بدون الإنترنت

عن طريق git push الأمر ، من الممكن دفع SSH (باستخدام الاتصال المحلي ، الإنترانت):

git remote add server ssh://[user@]host.xz[:port]/path/to/dev/repo.git/
git push server

أو الضغط في المجلد:

git push /mnt/usb/my_repo

هذا يفترض أنك تمتلك نسختين من المستودع الخاص بك.

الشيء نفسه مع السحب ، على سبيل المثال

git pull /mnt/usb/my_repo

الترقيع

لتطبيق التصحيحات ، يمكنك استخدامها patch الأمر أو git apply.

نرى: إنشاء ملف patch أو diff من مستودع git وتطبيقه على مستودع git مختلف آخر.


7
2017-10-17 12:09





يمكنك استخدام Git محليًا أيضًا. بعد ذلك ، يتم تخزين التزاماتك محليًا فقط ، ولا يزال لديك التحكم في الإصدار معها (ويمكن أن يتغير / دمج الخ) ، ولكن لا يمكنك الوصول إلى المخزون من أي جهاز كمبيوتر آخر.

يمكنك بدء مستودع Git محلي عن طريق التشغيل git init في مجلدك المحلي. كما هو موضح هنا.


5
2017-10-17 11:43



أعلم ، ولكني أرغب في العمل على جهاز كمبيوتر آخر وتطبيقه على الملفات الموجودة على الخادم بدون إمكانية الوصول إلى الإنترنت - Tutu Kaeen
TutuKaeen لا أرى أي خطأ في امتلاك المستودع على محرك أقراص فلاش واستنساخه / مزامنته إلى محركات الأقراص الصلبة لأجهزة الكمبيوتر المختلفة. ومع ذلك ، يبدو "الخادم دون الوصول إلى الإنترنت" غريبا ، والهدف من الخادم هو تقديم خدمة ، في معظم الأحيان ترتبط الخدمة بالشبكات (ولكن ليس دائما ، في الواقع). - AnonymousLurker
dhae - يرجى قضاء بعض الوقت لتقديم مزيد من التفاصيل حول كيفية استخدام Git محليًا. فقط الإشارة إلى أنه يمكن القيام به ليست مفيدة لإجابة. - Ramhound
anonymousLurker يعرض العرض البيانات على الشبكة المغلقة في مؤسسة مهمة جدًا. إنها لا تخدم أي شيء للإنترنت الواسع ، لأن البيانات حساسة للغاية وللموظفين فقط. - Tutu Kaeen
@ TutuKaeen: إذا حدث ذلك أي الوصول إلى الشبكة ، يمكنك دائما تشغيل خادم Git الخاص بك عبر SSH. هناك أكثر من Git من GitHub فقط. - grawity