Thread (5 messages) flat view 5 messages, 3 authors, 2016-06-15

Re: GIT cloning(or pull/push) doesn't work properly if you have a sub-folder as its own GIT repo

From: Chris Packham <hidden>
Date: 2016-06-15 22:51:05

On 24/04/11 05:04, Siddique Hameed wrote:
I don't want to categorize this as bug until I hear expert panel's
opinion. Spare me if its a known issue or if I am doing something
silly :) I did enough research online and couldn't find a good answer.
Not exactly an expert but I'll try to help.
Here it goes..

Let's say if I have a folder called "ParentGITRepo" which is a local
GIT repo. I have sub folders called "Child1Repo" and "Child2" with
some files on it. For some reason, whether accidentally or
deliberately, I make "Child1Repo" a GIT repo on its own. GIT
recognizes ParentGITRepo&  Child1Repo as separate GIT repositories.
But, if I clone "ParentGITRepo" into somewhere else, I am missing
everything from Child1Repo.
That's expected behaviour as far as I'm concerned (based on your 
example). ParentGITRepo and Child1Repo are completely independent at 
this point. Cloning ParentGITRepo won't get you any untracked files that 
happen to be in the work-tree of the repository you're cloning.
The worse thing is, even if I cleanup
"Child1Repo" by removing it's .git folder, the parent GIT repo is
ignoring any activity I do in that folder.
So your options at this point are to make Child1Repo a submodule or to 
re-write ParentGITRepo and Child1Repo into a new repository combining 
the history of both. Depending on your exact needs one option may be 
better than the other so do some more googling to find something that 
suits your case.
I think, the right way to do this setup is probably using git sub
modules or something. But given this scenario, what is the expected
behaviour? Am i missing? It would really make more sense if you can go
thro the following steps (test cases) outlined below.


# Setting up ParentGITRepo&  Child1Repo and Child2
$ cd ~
$ mkdir ParentGITRepo
$ cd ParentGITRepo/
$ git init .
$ mkdir Child1Repo
$ mkdir Child2
$ cd Child1Repo/
$ git init .
$ echo "Child1RepoFile">  Child1RepoFile.txt
$ git add .
$ git commit -a -m "Adding Child1Repo content"
At this point you could have just treated Child1Repo as a normal 
subdirectory. One thing some people struggle with is the fact that git 
doesn't track empty directories, as soon as there a files in those 
directories it'll work just fine.
[master (root-commit) 01ccc52] Adding Child1Repo content
  1 files changed, 1 insertions(+), 0 deletions(-)
  create mode 100644 Child1RepoFile.txt

$ cd ../Child2/
$ echo "Child2 file content">  Child2File.txt
$ cd ..
$ echo "Parentfile">  ParentFile.txt
$ git add .
$ git commit -a -m "Adding Parent content"
[master (root-commit) b31d0a5] Adding Parent content
  3 files changed, 3 insertions(+), 0 deletions(-)
  create mode 160000 Child1Repo
  create mode 100644 Child2/Child2File.txt
  create mode 100644 ParentFile.txt

---------------------------------------
  # Now verify ParentGITRepo&  Child1Repo working independently
$ cd ~/ParentGITRepo/
$ git log
commit b31d0a5aef19c6b119d89718f560905ad0f34aa7
Author: Siddique Hameed[off-list ref]
Date:   Fri Apr 22 11:25:15 2011 -0500

    Adding Parent content

$ cd ~/ParentGITRepo/Child1Repo/
$ git log
commit 01ccc52931f8b40f6d92b29769300a254d8dd411
Author: Siddique Hameed[off-list ref]
Date:   Fri Apr 22 11:22:00 2011 -0500

    Adding Child1Repo content

--------------------------------------------

# Now try cloning ParentGITRepo&  verify the contents inside it
$ cd ~
$ git clone ParentGITRepo/ ParentGITRepoClone/
Cloning into ParentGITRepoClone...
done.
$ cd ParentGITRepoClone/
$ ls -a
./  ../  .git/  Child1Repo/  Child2/  ParentFile.txt

$ cd Child1Repo/
$ ls -a
./  ../

$ git log
commit b31d0a5aef19c6b119d89718f560905ad0f34aa7
Author: Siddique Hameed[off-list ref]
Date:   Fri Apr 22 11:25:15 2011 -0500

    Adding Parent content

--------------------------------------------

As you can see there is nothing in Child1Repo after its was cloned. I
also tried the reverse of this. Like, having a child folder as GIT
repo and make a ParentFolder a repo on its own&  clone the parent
folder and the cloned folder doesnt contain anything from child repo.

Let me know if you have more questions.

Thanks,

Siddique
--
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help