Repository: mlflow/mlflow

Issue:
[BUG] Git version not logged when executable in current path.
### Issues Policy acknowledgement

- [X] I have read and agree to submit bug reports in accordance with the [issues policy](https://www.github.com/mlflow/mlflow/blob/master/ISSUE_POLICY.md)

### Where did you encounter this bug?

Local machine

### Willingness to contribute

Yes. I can contribute a fix for this bug independently.

### MLflow version

- Client: 2.8.0

### System information

- **OS Platform and Distribution (e.g., Linux Ubuntu 16.04)**: Ubuntu 20.04.2 LTS
- **Python version**: 3.11.6


### Describe the problem

The tag ``mlflow.source.git.commit`` is not populated if running a python file that's in the current path.
Imagine a file ``mypath/myfile.py`` with this content:
```python
from mlflow.tracking.context.git_context import _get_source_version
print(_get_source_version())
```
If you run from within ``mypath`` via ``python myfile.py`` this will not produce a version,
but if you run from the parent folder via ``python mypath/myfile.py`` it will produce the correct version.

That is caused by [`get_git_commit`](https://github.com/mlflow/mlflow/blob/73fbc7d857b3f04b823b3fcbc6723efc41070288/mlflow/utils/git_utils.py#L47C1-L49C39)
using the path of the ``argv[1]``, and then passing this to ``Repo``. If the path is the current directory, ``os.path.dirname(path)`` will be the empty string, which will make ``Repo`` raise 
```
git.exc.GitCommandError: Cmd('git') failed due to: exit code(128)
  cmdline: git check-ignore
  stderr: 'fatal: empty string is not a valid pathspec. please use . instead if you meant to match all paths
```
which will be caught, and then an empty string will be returned.

A work-around could be as easy as replacing empty string by ``'.'``, or maybe better using ``os.path.dirname(os.path.abspath(path))``?




### What component(s) does this bug affect?

- [ ] `area/artifacts`: Artifact stores and artifact logging
- [ ] `area/build`: Build and test infrastructure for MLflow
- [ ] `area/deployments`: MLflow Deployments client APIs, server, and third-party Deployments integrations
- [ ] `area/docs`: MLflow documentation pages
- [ ] `area/examples`: Example code
- [ ] `area/model-registry`: Model Registry service, APIs, and the fluent client calls for Model Registry
- [ ] `area/models`: MLmodel format, model serialization/deserialization, flavors
- [ ] `area/recipes`: Recipes, Recipe APIs, Recipe configs, Recipe Templates
- [ ] `area/projects`: MLproject format, project running backends
- [ ] `area/scoring`: MLflow Model server, model deployment tools, Spark UDFs
- [ ] `area/server-infra`: MLflow Tracking server backend
- [X] `area/tracking`: Tracking Service, tracking client APIs, autologging

### What interface(s) does this bug affect?

- [ ] `area/uiux`: Front-end, user experience, plotting, JavaScript, JavaScript dev server
- [ ] `area/docker`: Docker use across MLflow's components, such as MLflow Projects and MLflow Models
- [ ] `area/sqlalchemy`: Use of SQLAlchemy in the Tracking Service or Model Registry
- [ ] `area/windows`: Windows support

### What language(s) does this bug affect?

- [ ] `language/r`: R APIs and clients
- [ ] `language/java`: Java APIs and clients
- [ ] `language/new`: Proposals for new client languages

### What integration(s) does this bug affect?

- [ ] `integrations/azure`: Azure and Azure ML integrations
- [ ] `integrations/sagemaker`: SageMaker integrations
- [ ] `integrations/databricks`: Databricks integrations


Discussion:
Thanks ! I suggest we use `os.path.dirname(os.path.abspath(path))` to fix this. This is a more strict way.
Feel free to file a PR, appreciate your contribution!

Resolving patch:
diff --git a/mlflow/utils/git_utils.py b/mlflow/utils/git_utils.py
--- a/mlflow/utils/git_utils.py
+++ b/mlflow/utils/git_utils.py
@@ -44,7 +44,7 @@ def get_git_commit(path: str) -> Optional[str]:
         return None
     try:
         if os.path.isfile(path):
-            path = os.path.dirname(path)
+            path = os.path.dirname(os.path.abspath(path))
         repo = Repo(path, search_parent_directories=True)
         if path in repo.ignored(path):
             return None


Test patch: