gitmodulesSymlink .gitmodules is a symbolic link

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi

I can not rebase symlinks of an 6 years old repository.
See attached files (two languages, EN auto translation) for more details.
Created with `git bugreport`

Kind regards
Florian
[EN](#EN) Translated by https://www.deepl.com/translator



# EN

Thank you for filling out a Git bug report!
Please answer the following questions to help us understand your problem.
understand your problem.


What did you do before the error occurred? (Steps to reproduce your error
reproduce your error)


For 6 years I only did remote pushes locally to my local master.
github.com then refused to accept one.


The reason: 
And now github.com but also `git` itself are bitching in detail.


github.com, as it no longer accepts a push:
    
    index-pack failed
    remote: error: object [hash]: gitmodulesSymlink: .gitmodules is a symbolic link


And `git` itself also aborts. So I can't solve the problems this way.


    git filter-branch --tree-filter 'rm -f .gitmodules' HEAD
    Rewrite [SomeHash] (3/185) (0 seconds passed, remaining 0 predicted) \
        error: Invalid path '.gitmodules' Could not initialize the index


The same attempt also failed with an older VM where `git`
version 2.11.0 was still available.





What did you expect to happen? (Expected behavior)

Rebase should work. Always :-)



What happened instead? (Actual behavior)

Abort of git.

    git filter-branch --tree-filter 'rm -f .gitmodules' HEAD
    Rewrite [SomeHash] (3/185) (0 seconds passed, remaining 0 predicted) \
        error: Invalid path '.gitmodules' Could not initialize the index



What is the difference between what you expected and what actually happened?
really happened?

With a current git version I can't fix such errors.

But in general I think the exclusion of symlinks to git system files is a mistake. It is implemented too sweepingly in my eyes.


Any other comments you would like to add:


My `.gitmodules` were always a matching file in the same directory to
to become aware that something is changing during a merge.
Branches are staging areas for me, among other things) 
```
    .gitmodules -> symlinks to one of these files 
                    (depending on the current branch)

        -> .gitmodules_stable
                ^ ------------------ Staging to stable, release
        -> .gitmodules_testing
                ^ ------------------ Staging to testing, testing and preview
        -> .gitmodules_unstable
                ^ ^ ^---<---------<-- Feature branch A
                +-----<---------<-- Feature branch B
                +-------<---------<-- Feature branch C ...
```

With a merge unstable -> testing (-ff), settings from unstable would simply be
would simply be included/adopted in testing without drawing attention to it.
attention. This also has the consequence that you are no longer made aware
that the dependencies of the submodules must also be raised,
before the merge is clean/finished.

If you are working on several submodules, this makes perfect sense. Especially
if you don't have or want to have everything online in order to check/test the current
to check/test the current status etc. before you then bind the hashes of the submodules and
then make everything public piece by piece depending on the dependency.
What an effort :-/

With `git` itself (version 2.39.0, Debian Bookworm, 2023) you can still work locally.
continue to work. With github.com, however, the fun is over. If it is in the
repository `git` system files like `.gitignore` or `.gitmodules` that are symlinks
are symlinks, github.com refuses to do any work to fix the bugs.
the bugs. Neither via the web interface nor via `git push --force` itself. Whew.

So: After 6 years! In between there were local updates from time to time, but these were
were not made public. The operating system, a Debian, is updated about every
updated every two years. So there have been at least 3 new `git` versions since then for
for this project. With the current version of `git` I cannot fix the problems
fix the problems. And that is really bad!

## Solution

Option 3. was the solution. A Debian Wheezy (7.3) brought a `git` 
version 1.7.10.4, which I used to rebase one of the known and problematic commits. 
known and problematic commits. I may have traveled too far into the
past, but this gave me a basis for testing.
Maybe it will stay that way and everything will be fine again?

Following this, and in order to do everything automatically again, the
git filter-branch came to mind again:

    git filter-branch --tree-filter 'rm -f .gitmodules' HEAD

Did its job, but didn't help anything Direction github.com as `push --force` for
for this branch.

    - git filter-branch --tree-filter 'rm -f .gitmodules' HEAD
    + git filter-branch --tree-filter 'rm -f .gitmodules'

So: complete and over everything please.

But to make this situation tidy:

    .gitmodules ->- symlink to one of these... ->-
    -> .gitmodules_master
    -> .gitmodules_stable
    -> .gitmodules_testing
    -> .gitmodules_unstable


'rm -f .gitmodules' deletes, but does not delete the underlying bindings of the 
submodules. Here, too, there were mixtures in the use/application, as the
history clearly showed on closer inspection. But the roadmap for doing it this way 
remained consistent.

I had to fetch the local repository from the backup quite often in order to be able to repeat the many test steps.
to be able to repeat the many steps of tests...

Finally: Submodules (`.gitmodules`) were always a symlink in the idea.
So in order for it to fit for the repair in the future, all symlinks must be resolved into a
real file, so that the rebase via `git filter-branch
--tree-filter` can run cleanly and the dependencies in the base remain clean.
remain clean. And that looks like this:

    # If .gitmodules is a symlink: 
    # - Find the path to the real file
    # - Delete the symlink
    # - Copy the real file to .gitmodules
    git filter-branch --tree-filter \
        'if [ -h .gitmodules ];then loc=$(readlink .gitmodules); rm -f .gitmodules; cp $loc .gitmodules; fi;'
    
This solved the problem. Symlinks removed and replaced with the real content
replaced by the real content. However, the complete history has now been rewritten. Locally as
as well as the newer `git` versions (clients and local server) reported
no more errors.

# Conclusion

I don't like the way `git` currently works. Symlinks help in
my case. They are transparent and available in every branch within the repository
and are maintained. 

The most important thing: they make work easier as they draw attention to changes.
changes. This saves an enormous amount of time and running around afterwards if you forget to
to correct the submodules because with an almost forward merge it is simply treated 
treated as new = better. Submodules are bound in the same branch workflow
in the same branch workflow.





Please check the rest of the error report below.
You can delete any line you do not want to report.


[System Info]
git Version:
git version 2.39.2
cpu: x86_64
no commit associated with this build
sizeof-long: 8
sizeof-size_t: 8
shell-path: /bin/sh
uname: Linux 6.1.0-13-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.55-1 (2023-09-29) x86_64
Compiler Info: gnuc: 12.2
libc Info: glibc: 2.36
$SHELL (typically, interactive shell): /bin/zsh


[Aktivierte Hooks]

[DE](#DE)
[EN] See other text file



# DE

Vielen Dank für das Ausfüllen eines Git-Fehlerberichts!
Bitte antworten Sie auf die folgenden Fragen, um uns dabei zu helfen, Ihr
Problem zu verstehen.

Was haben Sie gemacht, bevor der Fehler auftrat? (Schritte, um Ihr Fehler
zu reproduzieren)

6 Jahre lang habe ich nur lokal zu meinem lokalen master remote pushes gemacht.
github.com hat dann eine Annahme verweigert.

Der Grund: 
Und nun sind github.com aber auch `git` selbst im Detail zickig.

github.com, da es einen Push nicht mehr akzeptiert:
    
    index-pack failed
    remote: error: object [hash]: gitmodulesSymlink: .gitmodules is a symbolic link

Und `git` selbst bricht auch ab. Ich kann die Probleme so also nicht lösen.

    git filter-branch --tree-filter 'rm -f .gitmodules' HEAD
    Rewrite [SomeHash] (3/185) (0 seconds passed, remaining 0 predicted) \
        error: Invalid path '.gitmodules' Could not initialize the index

Der gleiche Versuch scheiterte ebenfalls mit einer älteren VM, wo noch `git`
Version 2.11.0 verfügbar war.



Was haben Sie erwartet, was passieren soll? (Erwartetes Verhalten)

Rebase soll funktionieren. Immer :-)



Was ist stattdessen passiert? (Wirkliches Verhalten)

Abbruch von git.

    git filter-branch --tree-filter 'rm -f .gitmodules' HEAD
    Rewrite [SomeHash] (3/185) (0 seconds passed, remaining 0 predicted) \
        error: Invalid path '.gitmodules' Could not initialize the index



Was ist der Unterschied zwischen dem, was Sie erwartet haben und was
wirklich passiert ist?

Mit einer aktuellen git Version kann ich derartige Fehler nicht bereinigen.

Aber ansich halte ich das ausgrenzen von symlinks zu git system Dateien für einen Fehler. Es ist zu Pauschal in meinen Augen implementiert.


Sonstige Anmerkungen, die Sie hinzufügen möchten:

Meine `.gitmodules` waren immer eine passende Datei im gleichen Verzeichnis, um
bei einem Merge darauf aufmerksam zu werden, das sich etwas ändert.
Branches sind bei mir u.a Staging- Bereiche) 
```
    .gitmodules -> symlinks zu einer dieser Dateien 
                    (abhängig zum aktuellen Branch)

        -> .gitmodules_stable
                ^ ------------------ Staging to stable, release
        ->  .gitmodules_testing
                ^ ------------------ Staging to testing, testing and preview
        ->  .gitmodules_unstable
                ^ ^ ^---<---------<-- Feature branch A
                | +-----<---------<-- Feature branch B
                +-------<---------<-- Feature branch C ...
```

Bei einem merge unstable -> testing (-ff) würden Einstellungen von unstable
einfach in testing mit einbezogen/übernommen werden, ohne darauf aufmerksam zu
werden. Was auch zur Folge hat, dass man nicht mehr darauf aufmerksam gemacht
wird, das die Abhängigkeiten der Submodule ebenfalls angehoben werden müssen,
bevor der merge sauber/ fertig ist.

Wenn an mehreren Submodulen gearbeitet wird, macht das durchaus Sinn. Gerade
dann, wenn man eben nicht alles online hat oder haben will, um einen aktuellen
Stand zu prüfen/testen etc. bevor man dann die Hashes der Submodule bindet und
alles dann je nach Abhängigkeit Stück für Stück öffentlich stellt.
Was für ein Aufwand :-/

Mit `git` selbst (Version 2.39.0, Debian Bookworm, 2023) kann man lokal noch
weiter arbeiten. Bei github.com ist allerdings Schluss mit lustig. Wenn es im
Repository `git` System Dateien gibt wie `.gitignore` oder `.gitmodules` die
Symlinks sind, verweigert github.com jegliche Arbeit, die Bugs beseitigen zu
können. Weder über das Webinterface noch via `git push --force` selbst. Uff.

Also: Nach 6 Jahren! Dazwischen gab es lokal immer wieder mal Updates, die aber
nicht öffentlich gestellt wurden. Das Betriebssystem, ein Debian, wird etwa alle
zwei Jahre aktualisiert. Neue `git` Versionen sind also mind. 3 Stk. seither für
dieses Projekt dabei. Mit der aktuellen Version von `git` kann ich die Probleme
allerdings nicht beheben. Und das ist wirklich schlecht!

## Lösungsweg

Option 3. war dann die Lösung. Ein Debian Wheezy (7.3) brachte eine `git` 
Version 1.7.10.4 mit, mit der ich einen Rebase auf einen der mir bekannten und 
problembehafteten Commits zulies. Ich bin vielleicht zu weit in die
Vergangenheit gereist, aber hiermit hatte ich erst einmal eine Basis zum testen.
Vielleicht bleibt es so und alles ist wieder gut!?

Darauf folgend und, um wieder automatisch alles zu erledigen, kam mir der
git filter-branch wieder in den Gedanken:

    git filter-branch --tree-filter 'rm -f .gitmodules' HEAD

Tat seinen Dienst, half aber nichts Richtung github.com als `push --force` für
diesen Branch.

    - git filter-branch --tree-filter 'rm -f .gitmodules' HEAD
    + git filter-branch --tree-filter 'rm -f .gitmodules'

Also: komplett und über alles bitte.

Damit diese Situation aber ordentlich wird:

    .gitmodules ->- symlink zum einem dieser... ->-
    -> .gitmodules_master
    -> .gitmodules_stable
    -> .gitmodules_testing
    -> .gitmodules_unstable

'rm -f .gitmodules' löscht, löst aber nicht die zugrunde liegenden Bindungen der 
Submodule. Auch hier gab es Mischungen in der Nutzung/ Verwendung, wie die
Historie beim genauen betrachten deutlich zeigte. Aber der Fahrplan, es so zu 
machen, blieb einheitlich.

Ich habe das lokale Repository recht oft aus dem Back-up holen müssen, um dann
die vielen Steps von Tests wiederholen zu können...

Schließlich: Submodule (`.gitmodules`) waren in der Idee immer ein Symlink.
Damit es zukünftig für die Reparatur passt, müssen also alle symlinks in eine
echte Datei aufgelöst werden, damit der rebase via `git filter-branch
--tree-filter` sauber laufen kann und die Abhängigkeiten in der Basis sauber
bleiben. Und das sieht dann wie folgt aus:

    # Wenn .gitmodules ein symlink ist: 
    #   - Finde den Pfad zur echten Datei
    #   - Lösche den Symlink
    #   - Kopiere die echte Datei zu .gitmodules
    git filter-branch --tree-filter \
        'if [ -h .gitmodules ];then loc=$(readlink .gitmodules); rm -f .gitmodules; cp $loc .gitmodules; fi;'
    
Damit war dieses Problem erledigt. Symlinks weg und durch den echten Inhalt
getauscht. Allerdings wurde nun die komplette History neu geschrieben. Lokal als
auch die neueren `git` Versionen (Klienten und lokaler Server) meldeten
keinerlei Fehler mehr.

# Fazit

Ich mag diese Funktionsweise von `git` aktuell hierzu nicht. Symlinks helfen in
meinem Fall. Sie sind transparent und in jedem Branch innerhalb des Repositories
verfügbar und werden gepflegt. 

Das wichtigste: Sie erleichten die Arbeit da sie auf Veränderungen aufmerksam
machen. Das spart ungemein viel Zeit und das hinterher laufen wenn man vergisst
die Submodule zu korrigieren da es bei einem fast forward merge schlicht weg 
als neu = besser behandeld wird. Submudule werden im gleichen branch-Workflow
so gebunden.





Bitte überprüfen Sie den restlichen Teil des Fehlerberichts unten.
Sie können jede Zeile löschen, die Sie nicht mitteilen möchten.


[System Info]
git Version:
git version 2.39.2
cpu: x86_64
no commit associated with this build
sizeof-long: 8
sizeof-size_t: 8
shell-path: /bin/sh
uname: Linux 6.1.0-13-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.55-1 (2023-09-29) x86_64
Compiler Info: gnuc: 12.2
libc Info: glibc: 2.36
$SHELL (typically, interactive shell): /bin/zsh


[Aktivierte Hooks]



# EN


[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]

  Powered by Linux