मैं भूतकाल में Git कैसे बनाऊं?


222

मैं अपने व्यक्तिगत उपयोग के लिए Git पर सब कुछ परिवर्तित कर रहा हूं और मुझे एक फ़ाइल के कुछ पुराने संस्करण पहले से ही रिपॉजिटरी में मिल गए। मैं फ़ाइल के "दिनांक संशोधित" के अनुसार सही क्रम में इतिहास के लिए इसे कैसे कर सकता हूं, इसलिए मेरे पास फ़ाइल का सटीक इतिहास है?

मुझे बताया गया था कि कुछ इस तरह काम करेगा:

git filter-branch --env-filter="GIT_AUTHOR_DATE=... --index-filter "git commit path/to/file --date " --tag-name-filter cat -- --all  

संक्षिप्त और सरल उत्तर: stackoverflow.com/a/34639957/2708266
यश

33
मुझे आश्चर्य है कि अगर लोग इसका जवाब ढूंढ रहे हैं तो बस अपने
गीथहब

1
@ZitRo हाँ। और बस सेटिंग git commit --date="xxx day ago" -m "yyy"उस उद्देश्य के लिए पर्याप्त है अगर कोई सोच रहा है।
व्लास सोकोलोव

alexpeattie.com/blog/working-with-dates-in-git : यदि एक कोमल स्पष्टीकरण की तलाश में है
thepurpleowl

जवाबों:


198

आपको दी गई सलाह त्रुटिपूर्ण है। बिना किसी सेटिंग के GIT_AUTHOR_DATE --env-filterको हर प्रतिबद्धता की तारीख को फिर से लिखना होगा। इसके अलावा, अंदर git कमिट का उपयोग करना असामान्य होगा --index-filter

आप यहां कई, स्वतंत्र समस्याओं से निपट रहे हैं।

अन्य तिथियों को "अब" निर्दिष्ट करना

प्रत्येक कमिट में दो तारीखें होती हैं: लेखक की तारीख और कमिट डेट। आप किसी नए आदेश को लिखने वाले किसी भी आदेश के लिए GIT_AUTHOR_DATE और GIT_COMMITTER_DATE के पर्यावरण चर के माध्यम से मूल्यों की आपूर्ति करके प्रत्येक को ओवरराइड कर सकते हैं। देखें "दिनांक प्रारूप" में Git-लिखें (1) या नीचे:

Git internal format = <unix timestamp> <time zone offset>, e.g.  1112926393 +0200
RFC 2822            = e.g. Thu, 07 Apr 2005 22:13:13 +0200
ISO 8601            = e.g. 2005-04-07T22:13:13

केवल आदेश लिखते हैं कि सामान्य उपयोग के दौरान एक नया प्रतिबद्ध है प्रतिबद्ध Git । इसमें एक --dateविकल्प भी है जो आपको लेखक की तारीख को सीधे निर्दिष्ट करता है। आपके प्रत्याशित उपयोग में git filter-branch --env-filterऊपर उल्लिखित पर्यावरण चर का उपयोग भी शामिल है (ये "env" का हिस्सा हैं जिसके बाद विकल्प का नाम दिया गया है; git-filter-branch (1) में "विकल्प" देखें और अंतर्निहित "प्लंबिंग" कमांड git-प्रतिबद्ध) —तीन (१)

इतिहास में एक एकल रेफरी में एक फ़ाइल सम्मिलित करना

यदि आपकी रिपॉजिटरी बहुत सरल है (यानी आपके पास केवल एक ही शाखा है, कोई टैग नहीं है), तो आप शायद कार्य करने के लिए गिट रिबास का उपयोग कर सकते हैं।

निम्नलिखित आदेशों में, "ए" के बजाय कमिट के ऑब्जेक्ट नाम (SHA-1 हैश) का उपयोग करें। जब आप git कमिट करते हैं तो "डेट ओवरराइड" विधियों में से एक का उपयोग करना न भूलें ।

---A---B---C---o---o---o   master

git checkout master
git checkout A~0
git add path/to/file
git commit --date='whenever'
git tag ,new-commit -m'delete me later'
git checkout -
git rebase --onto ,new-commit A
git tag -d ,new-commit

---A---N                      (was ",new-commit", but we delete the tag)
        \
         B'---C'---o---o---o   master

यदि आप नई फ़ाइल को शामिल करने के लिए ए को अपडेट करना चाहते हैं (जहां इसे जोड़ा गया था, तो एक नई प्रतिबद्ध बनाने के बजाय), तो git commit --amendइसके बजाय का उपयोग करें git commit। परिणाम इस तरह दिखेगा:

---A'---B'---C'---o---o---o   master

उपरोक्त कार्य तब तक करता है जब तक आप उस कमिट को नाम दे सकते हैं जो आपकी नई कमेटी का जनक होना चाहिए। यदि आप वास्तव में चाहते हैं कि आपकी नई फ़ाइल एक नई रूट कमिट (कोई माता-पिता) के माध्यम से जोड़ी जाए, तो आपको कुछ अलग करने की आवश्यकता है:

B---C---o---o---o   master

git checkout master
git checkout --orphan new-root
git rm -rf .
git add path/to/file
GIT_AUTHOR_DATE='whenever' git commit
git checkout -
git rebase --root --onto new-root
git branch -d new-root

N                       (was new-root, but we deleted it)
 \
  B'---C'---o---o---o   master

git checkout --orphanअपेक्षाकृत नया है (Git 1.7.2), लेकिन वही काम करने के अन्य तरीके हैं जो Git के पुराने संस्करणों पर काम करते हैं।

एक मल्टी- रेफरी इतिहास में एक फ़ाइल सम्मिलित करना

यदि आपकी रिपॉजिटरी अधिक जटिल है (यानी इसमें एक से अधिक रेफरी (शाखाएं, टैग आदि) हैं), तो आपको शायद गिट फ़िल्टर-शाखा का उपयोग करने की आवश्यकता होगी । गिट फ़िल्टर-शाखा का उपयोग करने से पहले , आपको अपनी संपूर्ण रिपॉजिटरी की एक बैकअप प्रतिलिपि बनानी चाहिए। आपके पूरे वर्किंग ट्री (.गित डायरेक्टरी सहित) का एक साधारण टार आर्काइव पर्याप्त है। git फ़िल्टर-शाखा बैकअप रीफ़ बनाती है, लेकिन अक्सर अपनी .gitनिर्देशिका को हटाकर और इसे अपने बैकअप से पुनर्स्थापित करके, एक बहुत-से-सही फ़िल्टरिंग से पुनर्प्राप्त करना आसान होता है ।

नोट: नीचे दिए गए उदाहरण निम्न-स्तरीय कमांड का git update-index --addउपयोग करते हैं git add। आप git ऐड का उपयोग कर सकते हैं , लेकिन आपको पहले फ़ाइल को किसी बाहरी स्थान से अपेक्षित पथ पर कॉपी करना होगा ( --index-filterअस्थायी GIT_WORK_TREE में इसका कमांड चलाता है जो खाली है)।

यदि आप चाहते हैं कि आपकी नई फ़ाइल को हर मौजूदा कमेटी में जोड़ा जाए, तो आप ऐसा कर सकते हैं:

new_file=$(git hash-object -w path/to/file)
git filter-branch \
  --index-filter \
    'git update-index --add --cacheinfo 100644 '"$new_file"' path/to/file' \
  --tag-name-filter cat \
  -- --all
git reset --hard

मुझे वास्तव में मौजूदा कमिट की तारीखों को बदलने का कोई कारण नहीं दिखता है --env-filter 'GIT_AUTHOR_DATE=…'। यदि आप इसका उपयोग करते हैं, तो आप इसे सशर्त बना देंगे ताकि यह हर प्रतिबद्ध के लिए तारीख को फिर से लिखे।

यदि आप चाहते हैं कि आपकी नई फ़ाइल कुछ मौजूदा प्रतिबद्धताओं ("ए") के बाद केवल कमिट में दिखाई दे, तो आप ऐसा कर सकते हैं:

file_path=path/to/file
before_commit=$(git rev-parse --verify A)
file_blob=$(git hash-object -w "$file_path")
git filter-branch \
  --index-filter '

    if x=$(git rev-list -1 "$GIT_COMMIT" --not '"$before_commit"') &&
       test -n "$x"; then
         git update-index --add --cacheinfo 100644 '"$file_blob $file_path"'
    fi

  ' \
  --tag-name-filter cat \
  -- --all
git reset --hard

आप चाहते हैं फ़ाइल को एक नए के माध्यम से जोड़े जाने के लिए तो प्रतिबद्ध है कि अपने इतिहास के बीच में डाला जा रहा है, तो आप नए उत्पन्न करने के लिए प्रतिबद्ध की आवश्यकता होगी उपयोग करने से पहले Git फिल्टर शाखा और जोड़ने --parent-filterके लिए Git फिल्टर शाखा :

file_path=path/to/file
before_commit=$(git rev-parse --verify A)

git checkout master
git checkout "$before_commit"
git add "$file_path"
git commit --date='whenever'
new_commit=$(git rev-parse --verify HEAD)
file_blob=$(git rev-parse --verify HEAD:"$file_path")
git checkout -

git filter-branch \
  --parent-filter "sed -e s/$before_commit/$new_commit/g" \
  --index-filter '

    if x=$(git rev-list -1 "$GIT_COMMIT" --not '"$new_commit"') &&
       test -n "$x"; then
         git update-index --add --cacheinfo 100644 '"$file_blob $file_path"'
    fi

  ' \
  --tag-name-filter cat \
  -- --all
git reset --hard

आप फ़ाइल को पहली बार एक नई रूट कमेटी में जोड़ने की व्यवस्था भी कर सकते हैं: अपने नए रूट कमिट को "रीथेन" विधि के माध्यम से बनाइए जो कि रीट रिबेस सेक्शन से है (इसे कैप्चर new_commitकरें), बिना शर्त का उपयोग करें --index-filter, और एक --parent-filterतरह "sed -e \"s/^$/-p $new_commit/\""


उपयोग के मामले के पहले उदाहरण में, "एक मल्टी-रेफरी हिस्ट्री में एक फ़ाइल सम्मिलित करना": क्या कोई तरीका है जो --index-filterकमिट द्वारा लौटाया गया है git rev-list? फिलहाल मैं इंडेक्स फिल्टर को रि-लिस्ट के सब-सेट पर लागू कर रहा हूं। किसी भी अंतर्दृष्टि की सराहना करें।
हेजहोग

@ हेजहोग: सभी "मल्टी-रेफ" उदाहरण -- --allकिसी भी रेफरी से आने वाले सभी कमिट्स को संसाधित करने के लिए उपयोग करते हैं। अंतिम उदाहरण दिखाता है कि केवल कुछ कमिट कैसे बदलें (जो भी आपको पसंद हो उसके लिए सिर्फ GIT_COMMIT का परीक्षण करें)। केवल आवागमन की एक विशिष्ट सूची को बदलने के लिए, आप फ़िल्टर करने से पहले सूची को सहेज सकते हैं (उदा git rev-list … >/tmp/commits_to_rewrite), फिर फ़िल्टर के अंदर सदस्यता के लिए परीक्षण करें (उदा if grep -qF "$GIT_COMMIT" /tmp/commits_to_rewrite; then git update-index …)। वास्तव में आप क्या हासिल करने की कोशिश कर रहे हैं? यदि आप टिप्पणियों में व्याख्या करना बहुत अधिक चाहते हैं, तो आप एक नया प्रश्न शुरू कर सकते हैं।
क्रिस जॉन्सन

मेरे मामले में, मेरे पास एक छोटी सी परियोजना है जिसे मैं स्रोत नियंत्रण में रखने का अर्थ था। (मैंने ऐसा नहीं किया था, क्योंकि यह एक एकल परियोजना है और मैंने तय नहीं किया था कि किस प्रणाली का उपयोग करना है)। मेरा "स्रोत नियंत्रण" मेरी पूरी परियोजना के पेड़ को एक नई निर्देशिका में डुप्लिकेट करने और पिछले-संस्करण निर्देशिका का नाम बदलने का मामला था। मैं Git के लिए नया हूँ (पहले SCCS, RCS, और एक बदसूरत मालिकाना RCS व्युत्पन्न जो CVS जैसा दिखता है) का उपयोग करने के बाद, इसलिए मेरे बारे में बात करने के बारे में चिंता न करें। मुझे यह आभास होता है कि उत्तर में "एक फ़ाइल को एक ही इतिहास में सम्मिलित करना" खंड की भिन्नता शामिल है। सही बात?
स्टीव

1
@ साइट: "सिंगल-रेफ" परिदृश्य लागू होता है यदि आपका इतिहास एकल, विकास की रेखा से था (यानी यह समझ में आता है कि यदि सभी स्नैपशॉट को एकल, रैखिक शाखा के क्रमिक बिंदुओं के रूप में देखा जाता है)। यदि आपके पास (या आपके इतिहास में) कई शाखाएँ हैं, तो "मल्टी-रेफ" परिदृश्य लागू होता है। जब तक आपका इतिहास जटिल नहीं होता है (विभिन्न ग्राहकों के लिए "कांटेक्ट किए गए" संस्करण, "बगफिक्स" शाखा को बनाए रखते हैं, जबकि नया काम "विकास" आदि में वापस होता है), तब आप शायद "एकल-रेफरी" स्थिति देख रहे हैं। हालांकि , ऐसा लगता है कि आपकी स्थिति इस सवाल से अलग है ...
क्रिस जॉन्सन

1
@ साइट: चूंकि आपके पास ऐतिहासिक डायरेक्टरी-स्नैपशॉट्स की एक श्रृंखला है- और आपके पास पहले से ही Git रिपॉजिटरी नहीं है - तो आप शायद import-directories.perlGit's contrib/(या import-tars.perl, या import-zips.py...) से अपने स्नैपशॉट के लिए एक नया Git रिपॉजिटरी बनाने के लिए भी उपयोग कर सकते हैं (साथ में "पुराने" टाइमस्टैम्प)। rebase/ filter-branchमेरा उत्तर में तकनीक केवल जरूरत है, तो आप एक फ़ाइल है कि गया था एक मौजूदा भंडार के इतिहास के "बाहर छोड़ दिया" सम्मिलित करना चाहते हैं कर रहे हैं।
क्रिस जॉन्सन

119

आप हमेशा की तरह कमिट बना सकते हैं, लेकिन जब आप कमिट करते हैं, तो पर्यावरण चर GIT_AUTHOR_DATEऔर GIT_COMMITTER_DATEउचित डेटासेट पर सेट करें ।

बेशक, यह आपकी शाखा की नोक पर कमिट करेगा (यानी, वर्तमान हेड कमिट के सामने)। अगर आप इसे रेपो में आगे पीछे करना चाहते हैं, तो आपको थोड़ा सा फैंसला करना होगा। मान लीजिए कि आपके पास यह इतिहास है:

o--o--o--o--o

और आप चाहते हैं कि आपकी नई प्रतिबद्धता ("एक्स" के रूप में चिह्नित) दूसरी दिखाई दे :

o--X--o--o--o--o

सबसे आसान तरीका यह होगा कि आप पहले कमिट से ब्रांच करें, अपनी नई कमेटी को जोड़ें, फिर नए के ऊपर अन्य सभी कमिट्स को रिबेट करें। इस तरह:

$ git checkout -b new_commit $desired_parent_of_new_commit
$ git add new_file
$ GIT_AUTHOR_DATE='your date' GIT_COMMITTER_DATE='your date' git commit -m 'new (old) files'
$ git checkout master
$ git rebase new_commit
$ git branch -d new_commit

25
मुझे हमेशा यह अच्छा जवाब लगता है, लेकिन फिर तारीख के प्रारूप को खोजने के लिए घबराना पड़ता है, इसलिए यहां अगली बार 'शुक्र जुलाई 26 19:32:10 2013 -0400'
मेबिगटग्यू

94
GIT_AUTHOR_DATE='Fri Jul 26 19:32:10 2013 -0400' GIT_COMMITTER_DATE='Fri Jul 26 19:32:10 2013 -0400' git commit
Xeoncross

15
उदाहरण के लिए और अधिक है, उदाहरण के लिए महामारी2013-07-26T19:32:10 : kernel.org/pub/software/scm/git/docs/…
Marian

3
वैसे, '-0400' भाग टाइमजोन ऑफसेट की भरपाई करता है। इसे ठीक से चुनने के बारे में जागरूक रहें ... क्योंकि यदि नहीं, तो आपका समय उसी के आधार पर बदल जाएगा। उदाहरण के लिए खुद के मामले में, जो शिकागो में रहते हैं, मुझे '-0600' (उत्तरी अमेरिका सीएसटी) चुनना था। आप यहाँ कोड पा सकते हैं: timeanddate.com/time/zones
evaldeslacasa

2
चूंकि तारीख को दोहराया जाना चाहिए, इसलिए मुझे एक और चर बनाना आसान लगा:THE_TIME='2019-03-30T8:20:00 -0500' GIT_AUTHOR_DATE=$THE_TIME GIT_COMMITTER_DATE=$THE_TIME git commit -m 'commit message here'
फ्रैंक हेनार्ड

118

मुझे पता है कि यह प्रश्न काफी पुराना है, लेकिन वास्तव में मेरे लिए यही काम आया है:

git commit --date="10 day ago" -m "Your commit message" 

16
यह पूरी तरह से काम किया। मैं सर्प्राइज़्ड हूं जो --dateमानव-पठनीय सापेक्ष दिनांक प्रारूप का भी समर्थन करता है।
ज़ित्रो

@ZitRo क्यों नहीं 10 दिन?
एलेक्स78191

10
चेतावनी: git --dateकेवल $ GIT_AUTHOR_DATE को संशोधित करेगा ... इसलिए परिस्थितियों के आधार पर आप वर्तमान दिनांक को कमिट ($ GIT_COMMITTER_DATE) से जोड़कर देखेंगे
Guido U. Draheim

3
@ GuidoU.Draheim ने क्या कहा, इस पर टैग किया गया। आप का उपयोग करके एक प्रतिबद्ध की पूरी जानकारी की जाँच कर सकते हैं git show <commit-hash> --format=fuller। वहां, आप देखेंगे कि AuthorDateआपके द्वारा निर्दिष्ट तिथि है, लेकिन CommitDateयह प्रतिबद्ध की वास्तविक तिथि है।
d4nyll

इसलिए कमेट को बदलने या पूरी तरह से अतीत की दिनांक बनाने का कोई तरीका नहीं है? @ d4nyll
राहुल

35

समय के साथ मेरे मामले में मैंने myfile_bak, myfile_old, myfile_2010, backups / myfile आदि के रूप में myfile के संस्करणों का एक गुच्छा बचा लिया था । मैं अपनी संशोधन तारीखों में myfile के इतिहास को गिट में डालना चाहता था। तो सबसे पुराने का नाम बदलकर माईफाइल रख दिया, git add myfileफिर git commit --date=(modification date from ls -l) myfile, नाम के साथ सबसे पुराने का नाम बदलकर माईफाइल, एक और गिट कमिट के साथ -dep, दोहराने ...

इसे कुछ हद तक स्वचालित करने के लिए, आप फ़ाइल के संशोधन समय प्राप्त करने के लिए शेल-फू का उपयोग कर सकते हैं। मैंने शुरुआत की ls -lऔर cut, लेकिन स्टेट (1) अधिक प्रत्यक्ष है

Git प्रतिबद्ध --date = "` स्टेट -c% y myFile `" myFile


1
अच्छा लगा। मेरे पास निश्चित रूप से मेरे गिट दिनों से पहले की फाइलें हैं जिनके लिए मैं संशोधित समय का उपयोग करना चाहता था। बहरहाल, यह केवल प्रतिबद्ध तिथि निर्धारित नहीं करता है (नहीं लेखक की तारीख?)
Xeoncross

Git-scm.com/docs/git-commit से: --date"प्रतिबद्ध में प्रयुक्त लेखक की तारीख को ओवरराइड करें।" git logलगता है कि तिथि AuthorDate है, git log --pretty=fullerदोनों AuthorDate और समितियाँ दिखाता है।
स्काईपेज

16
git commitविकल्प --dateकेवल संशोधित करेगा GIT_AUTHOR_DATE, नहीं GIT_COMMITTER_DATE। जैसा कि प्रो गिट बुक बताती है: "लेखक वह व्यक्ति है जिसने मूल रूप से काम लिखा है, जबकि कमिट वह व्यक्ति है जिसने काम को लागू किया है।" तारीखों के संदर्भ में, वह GIT_AUTHOR_DATEतारीख है जब फ़ाइल को बदल दिया गया था, जबकि GIT_COMMITTER_DATEवह तारीख थी जो यह प्रतिबद्ध थी। यहां यह ध्यान रखना महत्वपूर्ण है कि डिफ़ॉल्ट रूप से, git logलेखक तिथियों को "दिनांक" के रूप में प्रदर्शित करता है , लेकिन फिर --sinceविकल्प दिए जाने पर फ़िल्टर करने के लिए प्रतिबद्ध तिथियों का उपयोग करता है।
क्रिस्टोफर

OS X 10.11.1 में स्टेटस के लिए कोई -c विकल्प नहीं है
thinsoldier

stat -c %yMacOS (और अन्य BSD वेरिएंट) के लिए बराबर है stat -f %m
विजेता

21

निम्नलिखित क्या मैं पर परिवर्तन प्रतिबद्ध करने के लिए इस्तेमाल करते हैं fooकरने के लिए N=1अतीत में दिन:

git add foo
git commit -m "Update foo"
git commit --amend --date="$(date -v-1d)"

यदि आप एक भी पुरानी तारीख के लिए प्रतिबद्ध होना चाहते हैं, तो 3 दिन पहले कहें, बस dateतर्क बदल दें :date -v-3d

यह वास्तव में उपयोगी है जब आप कल के लिए कुछ करना भूल जाते हैं, उदाहरण के लिए।

अद्यतन : --dateभी --date "3 days ago"या जैसे भाव को स्वीकार करता है --date "yesterday"। इसलिए हम इसे एक पंक्ति कमांड तक कम कर सकते हैं:

git add foo ; git commit --date "yesterday" -m "Update"

6
चेतावनी: git --dateकेवल $ GIT_AUTHOR_DATE को संशोधित करेगा ... इसलिए परिस्थितियों के आधार पर आप वर्तमान दिनांक को कमिट ($ GIT_COMMITTER_DATE) से जोड़कर देखेंगे
Guido U. Draheim

2 दृष्टिकोणों को एक साथ मिलाना लगभग पूर्ण फिट बनाता है:git commit --amend --date="$(stat -c %y fileToCopyMTimeFrom)"
andrej

बहुत बढ़िया! एक मानव पठनीय तारीख के साथ एक ही कमानgit commit --amend --date="$(date -R -d '2020-06-15 16:31')"
पिक्सेल

16

मेरे मामले में, --डेट विकल्प का उपयोग करते समय, मेरी गिट प्रक्रिया दुर्घटनाग्रस्त हो गई। हो सकता है मैंने कुछ भयानक किया हो। और परिणामस्वरूप कुछ index.lock फ़ाइल दिखाई दी। इसलिए, मैंने .गित फ़ोल्डर से .lock फ़ाइलों को मैन्युअल रूप से हटा दिया और निष्पादित फ़ाइलों को पारित तिथियों में शुरू करने के लिए निष्पादित किया और इस बार काम किया। यहाँ सभी उत्तरों के लिए धन्यवाद।

git commit --date="`date --date='2 day ago'`" -am "update"

5
ऊपर टिप्पणीgit commit --date देखें । इसके अलावा, आपके उदाहरण के लिए प्रतिबद्ध संदेश को इन @JstRoRR
क्रिस्टोफर

4
चेतावनी: git --dateकेवल $ GIT_AUTHOR_DATE को संशोधित करेगा ... इसलिए परिस्थितियों के आधार पर आप वर्तमान दिनांक को कमिट ($ GIT_COMMITTER_DATE) से जोड़कर देखेंगे
Guido U. Draheim

9

ऐसा कमिट करने के लिए जो ऐसा दिखता है जैसे अतीत में आपको दोनों को सेट करना था GIT_AUTHOR_DATEऔर GIT_COMMITTER_DATE:

GIT_AUTHOR_DATE=$(date -d'...') GIT_COMMITTER_DATE="$GIT_AUTHOR_DATE" git commit -m '...'

जहां की date -d'...'तरह 2019-01-01 12:00:00या रिश्तेदार की तरह सटीक तारीख हो सकती है 5 months ago 24 days ago

गिट लॉग उपयोग में दोनों तिथियों को देखने के लिए:

git log --pretty=fuller

यह मर्ज कमिट के लिए भी काम करता है:

GIT_AUTHOR_DATE=$(date -d'...') GIT_COMMITTER_DATE="$GIT_AUTHOR_DATE" git merge <branchname> --no-ff

2

आप हमेशा अपने कंप्यूटर पर तारीख बदल सकते हैं, कमिट कर सकते हैं, फिर तारीख बदल सकते हैं और धक्का दे सकते हैं।


1
मुझे लगता है कि सही व्यवहार नहीं है, यह किसी अज्ञात मुद्दों बना सकते हैं
सस्ता शराब

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.