मैं रिपॉजिटरी में न होने पर Git कमांड कैसे निष्पादित कर सकता हूं?


131

क्या उस रिपॉजिटरी के बिना एक रिपॉजिटरी के खिलाफ Git कमांड को निष्पादित करने का एक तरीका है?

उदाहरण के लिए कुछ इस तरह git /home/repo log:?

कृपया मुझे इसे न बताएं cd। मैं एक execकॉल के माध्यम से यह कर रहा हूँ ।


3
क्या आप अपने निष्पादक कॉल के रूप में सिर्फ "cd / home / repo && git log" नहीं कर सकते?
एलेक्स हॉवान्स्की

मुझे इसके साथ कुछ अजीब समस्याएं हैं। मैं एक नई प्रक्रिया शुरू कर रहा हूं, वास्तव में एक निष्पादन नहीं है, लेकिन मुझे यह नहीं पता कि वे कैसे अलग हैं। मुझे गिट डायरेक्टरी निर्दिष्ट करने के लिए एक पैरामीटर खोजना आसान है।
टॉवर



1
git --गित-दिर = / घर / रेपो / .IT लॉग
अतीक उर रहमान

जवाबों:


102

प्रयत्न:

git --git-dir=/home/repo/.git log

अपनी रिपॉजिटरी की .git निर्देशिका तक सभी तरह से रास्ता देना महत्वपूर्ण है। अन्यथा आपको केवल एक त्रुटि संदेश मिलेगा जो कुछ कहता है:

fatal: Not a git repository

2
मैं मिलता रहा fatal: Not a git repository (or any of the parent directories): .git। @ पैट्रिक मैंने कुछ भी वोट नहीं किया?
टॉवर

3
@ पैट्रिक उत्तर को संपादित किया गया था (यह मूल रूप से --work-dirमुझे लगता है कि कहा गया है)
गैरेथ

1
यह मेरे लिए काम नहीं आया, क्योंकि इसने कमिट की सभी फाइलों को डिलीट कर दिया। ऐसा लगता है कि यह कमिट की जाँच कर रहा है लेकिन फ़ोल्डर की सामग्री नहीं। बेहतर प्रदर्शन के लिए @calandoa के जवाब का संदर्भ लें।
mxcd

2
मेरे लिए नवीनतम git का उपयोग करके काम नहीं किया, हालांकि -C विकल्प का उपयोग करके काम किया, उदाहरण: git -C /home/repo/.git log
D.Snap

1
यह वास्तव में अपेक्षित कविता के रूप में काम नहीं किया। यह कोई स्वीकृत उत्तर क्यों है? यह वर्तमान डायर को काम के पेड़ के रूप में उपयोग करेगा और इतिहास के लिए निर्दिष्ट .गित का उपयोग करेगा, जो पूरी तरह से गलत है। तुम सिर्फ लॉग, उदाहरण के लिए प्रदर्शित नहीं करते हैं, git status-Cजाने का सही तरीका है।
वांग

218

-Cविकल्प का उपयोग करें ( डॉक्स ):

git -C /home/repo log

यह सामान्य फोल्डर को जोड़ने और उसके बिना लगभग बराबर है--git-dir--work-tree.git

संपादित करें:

उत्तर अस्वीकृत ... काफी आश्चर्यजनक, जैसे, सख्ती से बोलना, यह सवाल का एकमात्र सही उत्तर है। विकल्प --git-dirऔर --work-treeकाम के पेड़ के बाहर से भंडार तक पहुंचने के लिए मौजूद नहीं हैं, उनका उपयोग .gitकहीं और स्थानांतरित करने के लिए किया जाता है , और वे कुछ मामलों में उपयोग करने के लिए अधिक जटिल हैं।

उदाहरण के लिए, /home/repo/subdirकेवल लॉग पाने के लिए :

git -C /home/repo/subdir log .

या

git -C /home/repo log subdir

के log .साथ --git-dirया का उपयोग करना संभव नहीं है --work-tree। काम के पेड़ के शीर्ष के सापेक्ष उपपथ को निकालने के लिए पथ को संसाधित किया जाना चाहिए, और उस स्थिति में भी, गिट इसे एक पथ के रूप में नहीं पहचानेंगे यदि आप --विकल्प का उपयोग नहीं करते हैं , तो एकमात्र संभव तरीका है:

git --git-dir /home/repo/.git log -- subdir

इसके अलावा, सबकॉमैंड के साथ मेरे संस्करण (git 1.9.1) के --work-treeसाथ बिल्कुल भी काम नहीं कर रहा है log। यह सिर्फ अनदेखा है:

git --git-dir /home/repo/.git --work-tree /home/repo/subdir log -- subdir
git --git-dir /home/repo/.git --work-tree /home/repo/whatever log -- subdir

मुझे यह भी समझ में नहीं आता है कि क्या यह बग या एक विशेषता है ... हमेशा की तरह कई डिज़ाइन डिज़ाइन विकल्पों के साथ।


अतिरिक्त स्पष्टीकरण जोड़ने के लिए धन्यवाद।
एरिक जी। हागस्ट्रॉम

git stashएक उपकमांड का एक और उदाहरण है जो विफल हो जाता है --git-dirऔर --work-treeउपयोग किया जाता है।
d5ve

4
-C विकल्प को गिट के संस्करण 1.8.5 में जोड़ा गया था, जिसे 2013 में जारी किया गया था।
d5ve

-C ने मुझसे बेहतर काम किया है - निती-मेरे लिए ... -C ने रेपो के लिए git config सेटिंग्स का सम्मान किया। चला रहा हूँ Git संस्करण 1.9.5.msysgit.1
जुर्माना

@calandoa क्या हमें हमेशा रूट से स्थान निर्दिष्ट करने की आवश्यकता है, एक और बात अगर रेपो के नाम में कई शब्द हैं, तो हम इस कोड में कैसे डालते हैं
कसुन सियामबलपिटिया

17

वास्तव में आपको - इगिट-डिर और --वर्क-ट्री का एक साथ उपयोग करने की आवश्यकता है। यहाँ एक उदाहरण है:

local [] Desktop: mkdir git
local [] Desktop: cd git
local [] git: touch README.txt
local [] git: git init
Initialized empty Git repository in /Users/albert/Desktop/git/.git/
local [] git: cd ..
local [] Desktop: git --work-tree=git --git-dir=git/.git add .
local [] Desktop: git --work-tree=git --git-dir=git/.git commit -a -m 'initial commit, called from outside the git directory'
[master (root-commit) ee951b1] initial commit, called from outside the git directory
0 files changed, 0 insertions(+), 0 deletions(-)
create mode 100644 README.txt
local [] Desktop: cd git
local [] git: git log --pretty=oneline
ee951b161053e0e0948f9e2a36bfbb60f9c87abe initial commit, called from outside the git di

1
यह अकेले --गीर के साथ उत्तर की तुलना में अधिक सही है। git-scm.com/blog/2010/04/11/environment.html
एरिक जी। हैगस्ट्रॉम

11

मैंने कई बार कोशिश की है! मैं आखिरकार मिल गया!

git -C dir --no-pager log --format='%an' -1 filename

याद रखें, कृपया अपने .git को न जोड़ें

-सी डीर


3

यह @ अधिकतम उत्तर के समान है। दुर्भाग्य से, --गित-दिर ने वह नहीं किया जिसकी मुझे आवश्यकता थी। संपादित करें पूर्वव्यापी में, एक और [पिछला] उत्तर जिसका मैंने उपयोग करने का सुझाव नहीं पढ़ा था --work-tree। मुझे यकीन नहीं है कि पर्यावरण या झंडे का उपयोग करना अधिक उचित है इसलिए मैं अपना जवाब छोड़ दूंगा अगर कोई इसमें उपयोग करता है, लेकिन मैं उपयोग करने के लिए स्विच करूंगा --work-tree/ करूंगा --git-dir


दो रिपोज हैं, एक दूसरे के अंदर लेकिन एक सबमॉड्यूल नहीं; बाहरी रेपो इसकी उपेक्षा करता है:

tools (outer repo)
  gcc/4.9.2 (inner repo)

जो मैं चाहता था git rev-parse --show-prefixवह बाहरी रेपो के सापेक्ष उत्पादन था । यहाँ मैं (बैश वाक्य रचना के साथ आया था, पठनीयता के लिए लाइनों में विभाजित):

prefix_dir=$(cd ..; git rev-parse --show-toplevel)
prefix_dir=$(GIT_WORK_TREE=${prefix_dir} git rev-parse --show-prefix)

4.9.2 के भीतर से निष्पादित होने पर यह स्ट्रिंग का उत्पादन करता है gcc/4.9.2


1

किसी भी git कमांड के लिए, आप कर सकते हैं:

git --git-dir=<PATH-TO-REPO>/.git --work-tree=<PATH-TO-REPO> <git-command>

उदाहरण के लिए, यदि आप git स्टेटस करना चाहते हैं:

 git --git-dir=/home/myrepo/.git --work-tree=/home/myrepo/  status

या यदि आप उस शाखा की जाँच करना चाहते हैं जो रेपो में है:

git --git-dir=/home/myrepo/.git --work-tree=/home/myrepo/  rev-parse --abbrev-ref HEAD
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.